科學計數法的兩道題
阿新 • • 發佈:2018-12-11
問題A我一開始沒想好,直接把字串全部讀進來,然後再把它還原成double型別的資料,再相加,然後再轉換成科學計數法,但是這樣做很容易漏掉某些特殊情況,於是我再模擬各種情況,導致最後的判斷語句又難看又不好調整。 於是到網上看了別人怎麼做,發現有一個方法很巧妙, 第一步先把字串讀進來,然後把所有的數字全部轉換成 longlong型別來儲存,同時記錄下小數點的位置。 第二步,對齊兩個相加數,不足的補0,然後相加 第三步,得到了int型別的資料後,再通過之前記錄下的小數點位置對資料進行處理,就是最終答案了 AC程式碼 我的程式碼就不貼了,沒有參考價值
#include<stdio.h>
int main()
{
char str1[50],str2[50];
long long s,s1,s2,ans;
int i,a1,a2,a,b,c,w,flag;
while(scanf("%s %s",str1,str2)!=EOF){
s1=s2=flag=b=c=a1=0;
//flag -
//c .
//b e後面的數
//s1是字串全部轉化為數字
//a1是要處理多少位小數點
for(i=0;str1[i];i++){
if(str1[i]=='-' )
flag=1;
else if(str1[i]=='.')
c=1;
else if(str1[i]=='e'||str1[i]=='E'){
sscanf(str1+i+1,"%d",&b);
a1+=b;
break;
}
else{
s1=s1*10+str1[i]-'0';
a1- =c;
}
}
if(flag) s1=-s1;
flag=b=c=a2=0;
for(i=0;str2[i];i++){
if(str2[i]=='-')
flag=1;
else if(str2[i]=='.')
c=1;
else if(str2[i]=='e'||str2[i]=='E'){
sscanf(str2+i+1,"%d",&b);
a2+=b;
break;
}
else{
s2=s2*10+str2[i]-'0';
a2-=c;
}
}
if(flag) s2=-s2;
//補0對齊
if(a1<a2)
for(;a1<a2;a2--)
s2*=10;
else if(a1>a2)
for(;a1>a2;a1--)
s1*=10;
a=a1;s=s1+s2;
if(!s){
printf("0\n");
continue;
}
//處理小數點 只要在能被10整除的時候才能這樣做
while(a<0&&s%10==0){
s/=10;
a++;
}
//如果要進位
if(a>=0){
//先輸出所有數字
printf("%lld",s);
for(i=0;i<a;i++)
printf("0"); //再輸出a個0
printf("\n");
continue;
}
//對-號的處理
flag=0;
if(s<0){
s=-s;
flag=1;
}
ans=1;w=0;
//不斷乘ans,最後再用s/ans得到小數點前的資料
while(ans<=s){
ans*=10;
w++;
}
//除掉多進的1位
if(ans>1){
ans/=10;
w--;
}
if(flag)
printf("-");
printf("%lld",s/ans); //直接除掉10^ans,保證小數點前只剩下一位
if(ans>1)
printf(".%lld",s%ans);//小數點後的部分
printf("e%d\n",a+w);//e的部分 a+w是最終的位數
}
return 0;
}
很巧妙的方法避免了處理多種情況的要求。
問題B也是科學記數法,其滿足正則表示式 [±][1-9].[0-9]+E[±][0-9]+ 這裡可以用scanf來讀入資料:
scanf("%c%c.%[0-9]E%d",&flag,&a[0],a+1,&ex);
然後再進行轉換即可 OJ有一些測試點沒通過,但是大體上邏輯沒問題,就沒去管了。
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
int main(){
char flag;
char a[10000]={0};
int ex;
scanf("%c%c.%[0-9]E%d",&flag,&a[0],a+1,&ex);
if(flag=='-') printf("-");
if(ex<0){
printf("0.");
for(int i=0;i<abs(ex);i++){
printf("0");
}
printf("%s",a);
}
else{
for(int i=0;i<=ex || a[i]!=0;i++){
if(i==ex+1){
printf(".");
}
if(a[i]==0){
printf("0");
}
else printf("%c",a[i]);
}
}
return 0;
}