又是一道字符串处理的题目。。。
题意:给出两个浮点数,询问它们保留n位小数的科学计数法(0.xxx*10^x)是否相等。根据是和否输出相应答案。
思路:
先分别将两个浮点数转换成相应的科学计数法的格式
1.point为小数点的索引,初始化为字符串的长度len
2.not0位第一个非0的数字的索引,初始化为len
如果not0为len,表明该浮点数为0,特殊处理,形式为0.0..0*10^0
否则根据point和not0的大小,计算相应的指数。
接着便是从str的not0开始,给ans赋值,共n位不包括小数点的数字,不足的最后补0即可。
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> using namespace std; const int maxn=200; char s1[maxn],s2[maxn]; int n; void solve(char*str,char*ans,int n,int &e){ int len=strlen(str); int point=len; //小数点的索引 for(int i=0;i<len;i++){ if(str[i]=='.'){ point=i; break; } } int not0=len; //第一个非0的索引 for(int i=0;i<len;i++){ if(str[i]!='.' && str[i]!='0'){ not0=i; break; } } //数字为0 if(not0==len){ e=0; ans[0]='0'; ans[1]='.'; for(int i=0;i<n;i++) ans[2+i]='0'; ans[n+2]='\0'; } else{ e=point>not0?point-not0:point-not0+1; //指数 ans[0]='0'; ans[1]='.'; for(int i=0,j=not0;i<n;i++,j++){ if(j<len){ if(str[j]!='.') ans[2+i]=str[j]; else i--; } else ans[2+i]='0'; } ans[2+n]='\0'; } } int main() { scanf("%d %s %s",&n,s1,s2); char ans1[maxn],ans2[maxn]; int e1,e2; solve(s1,ans1,n,e1); solve(s2,ans2,n,e2); if(strcmp(ans1,ans2)==0 && e1==e2){ printf("YES "); printf("%s*10^%d\n",ans1,e1); } else{ printf("NO "); printf("%s*10^%d %s*10^%d\n",ans1,e1,ans2,e2); } return 0; }