C. Exponential notation
题目大意是给你一串数字,让你把这串数字用科学计数法表示出来,有几个要注意的地方:
(1)表示出来的答案不能有多余的0
(2)如果b=0,那么答案不显示E
(3)如果a是整数,那么不显示小数点
b的大小比较容易得到,只要用字符串中小数点的位置减去第一个非0数的位置,如果这个数值大于0减一,小于0不做处理就好了。
a的字符串比较麻烦,因为不仅要去除多余的0,还要处理小数点的移动,这里的处理有很多写法,我采取的是把第一个非0数以及以后的数字记录下来,然后在输出那里做处理
有一段时间没写代码了,变量名的命名和逻辑都有点乱
题目大意是给你一串数字,让你把这串数字用科学计数法表示出来,有几个要注意的地方:
(1)表示出来的答案不能有多余的0
(2)如果b=0,那么答案不显示E
(3)如果a是整数,那么不显示小数点
我们只要得到a字符串和b的大小,根据这两个值判断如何输出就好了。
b的大小比较容易得到,只要用字符串中小数点的位置减去第一个非0数的位置,如果这个数值大于0减一,小于0不做处理就好了。
a的字符串比较麻烦,因为不仅要去除多余的0,还要处理小数点的移动,这里的处理有很多写法,我采取的是把第一个非0数以及以后的数字记录下来,然后在输出那里做处理
代码如下:
#include<cstdio>
#include<cstring>
using namespace std;
char str[1111111],ans[1111111];
int main(){
int flag=-1,wei,num=0; //flag记录从左向右第一个非0数的位置,wei记录小数点的位置
scanf("%s",str);
wei=strlen(str); //默认小数点在最后
for(int i=0;str[i];i++){
if(flag==-1&&str[i]!='0'&&str[i]!='.') flag=i; //找到第一个非0数位置
if(str[i]=='.') wei=i; //找到小数点位置
if(flag!=-1) ans[num++]=str[i]; //清除原来字符串左边的0的新字符串
}
num=strlen(ans);
for(int i=num-1;ans[i]=='0'||ans[i]=='.';i--) num--; //清除字符串右边的0以及小数点,并减少字符串长度
if(!num){
ans[0]='0';
num++;
}
printf("%c",ans[0]);
if(num!=1) printf(".");
for(int i=1;i<num;i++) if(ans[i]!='.') printf("%c",ans[i]);
wei=wei-flag;
if(wei>0) wei--;
if(wei&&flag!=-1) printf("E%d",wei); //假如b=0,则不输出E
printf("\n");
return 0;
}
有一段时间没写代码了,变量名的命名和逻辑都有点乱