一次通过测试点,开心!~
【基本思想】设计移位程序,分别处理以下情况:
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);
}
}