0.abc...(a!=0)型科学计数法表示
此题因为数据超长需用字符串进行处理,有一些细节需要注意
1. 整数部分之前和小数部分之后可能都有多余的0
2.真值为0的数的指数都计作0
3.类似0.0008之类整数为0且小数部分有前导0的数要转化为0.8来考虑并相应修改指数
4.转化后的数可能后面要补0
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char a[105],b[105];
int a1,b1;
void change(char ch[],int num,int& x)
{
int i,flag,ls,lp,le;
for( i=0,flag=0;ch[i]!='\0';i++)
if(ch[i]!='0'&&ch[i]!='.')
{
flag=1;
break;
}
if(flag==0) //全零
{
for(i=0;i<num;i++)
ch[i]='0';
ch[i]='\0';
x=0;
}
else
{
for(i=0;ch[i]!='\0';i++)
if(ch[i]>='1'&&ch[i]<='9')
{
ls=i;
break;
}
lp=-1;
for (i=0;ch[i]!='\0';i++)
if(ch[i]=='.')
{
lp=i;
break;
}
for (i=0;ch[i]!='\0';i++)
;
for(;i>=0;i--)
if(ch[i]>='1'&&ch[i]<='9')
{
le=i;
break;
}
if(lp==-1) //没有小数点
{
if(ls==0)
{
int k;
for(k=ls;ch[k]>='0'&&ch[k]<='9';k++)
;
x=k;
}
else
{
x=le-ls+1;
}
for(i=ls;i<=le;i++)
ch[i-ls]=ch[i];
int y=le-ls;
if(y<num)
{
while(y<num-1)
{
ch[i-ls]='0';
i++;
y++;
}
ch[i-ls]='\0';
}
else
{
ch[num]='\0';
}
}
else
{
if(ls<lp&&lp<le) //几零点零几
{
for(i=ls;i<lp;i++)
ch[i-ls]=ch[i];
i++;
for(;i<=le;i++)
ch[i-ls-1]=ch[i];
x=lp-ls;
int y=le-ls;
if(y<num)
{
while(y<num)
{
ch[i-ls-1]='0';
i++;
y++;
}
ch[i-ls-1]='\0';
}
else
{
ch[num]='\0';
}
}
if(lp!=-1&&lp<ls&&ls<=le) //零点零几
{
for(i=ls;i<=le;i++)
ch[i-ls]=ch[i];
x=lp-ls+1;
int y=le-ls+1;
if(y<=num)
{
while(y<num)
{
ch[i-ls]='0';
i++;
y++;
}
ch[i-ls]='\0';
}
else
{
ch[num]='\0';
}
}
if(ls<=le&&le<lp)
{
for(i=ls;i<=le;i++)
ch[i-ls]=ch[i];
x=lp-ls;
int y=le-ls+1;
if(y<=num)
{
while(y<num)
{
ch[i-ls]='0';
i++;
y++;
}
ch[i-ls]='\0';
}
else
{
ch[num]='\0';
}
}
}
}
}
void com(char ch1[],char ch2[],int num)
{
change(ch1,num,a1);
change(ch2,num,b1);
int same=1;
for(int t=0;ch1[t]!='\0'&&ch2[t]!='\0';t++)
if(ch1[t]!=ch2[t])
{
same=0;
break;
}
if(same&&a1==b1)
{
printf("YES 0.%s*10^%d\n",ch1,a1);
}
else
{
printf("NO 0.%s*10^%d 0.%s*10^%d\n",ch1,a1,ch2,b1);
}
}
int main()
{
int n;
scanf("%d%s%s",&n,a,b);
com(a,b,n);
return 0;
}