【PAT 甲级】A1060 Are They Equal(25分)

一次通过测试点,开心!~
【基本思想】设计移位程序,分别处理以下情况:
1) 00000.000x
2)xxx.yyy
3)xxxx
然后在得到的.xxxxxx后补max个0,并且记录好小数点的移位次数。
主函数就是一个简单的过程模拟!
设n为浮点数的长度,则时间复杂度为O(n)。

#include <bits/stdc++.h>
using namespace std;
void dlt0(char s[],int &n)			//delete 0s and calculate the exp
{
	bool dot_flag = false;
	int dot=-1;						//the position of the dot
	while(s[0]=='0')
	{
		for(int i=0;i<strlen(s);i++)
		s[i]=s[i+1];
	}
	if(s[0]=='.')							//0.xxxx
	{
		while(s[1]=='0')
		{
			for(int i=1;i<strlen(s);i++)
				s[i]=s[i+1];
			n--;
		}
	}
	else									
	{
		for(int i=0;i<strlen(s);i++)
		if(s[i]=='.')
		{
			dot_flag=true;
			dot=i;
		}
		if(dot_flag)						//xxx.yyy
		{
			n=dot;
			for(int i=dot;i>0;i--)
			{
				s[i]=s[i-1];
			}
			s[0]='.';
		}
		else								//xxxx
		{
			n=strlen(s);
			for(int i=strlen(s)+1;i>0;i--)
			s[i]=s[i-1];
			s[0]='.';
		}
	}
	//pad 0s
	for(int i=strlen(s);i<110;i++)
	s[i]='0';
	s[110]='\0';
}

int main(void)
{
	int n,k1=0,k2=0;
	char f1[110];
	char f2[110];
	bool flag=true;
	scanf("%d%s%s",&n,f1,f2);
	dlt0(f1,k1);dlt0(f2,k2);
	for(int i=1;i<=n;i++)
	{
		if(f1[i]!=f2[i])
		{
			flag=false;break;
		}
	}
	if(flag)	//YES
	{
		printf("YES 0.");
		for(int i=1;i<=n;i++)
		printf("%c",f1[i]);
		printf("*10^%d",k1);
	}
	else
	{
		printf("NO 0.");
		for(int i=1;i<=n;i++)
		printf("%c",f1[i]);
		printf("*10^%d 0.",k1);
		for(int i=1;i<=n;i++)
		printf("%c",f2[i]);
		printf("*10^%d",k2);
	}
}
发布了15 篇原创文章 · 获赞 1 · 访问量 181

猜你喜欢

转载自blog.csdn.net/weixin_42278063/article/details/104544785