大明A+B
大明A+B
Time Limit:1000MS ? ? Memory Limit:32768KB ? ? 64bit IO Format:%I64d & %I64u
Description
話說,經過了漫長的一個多月,小明已經成長了許多,所以他改了一個名字叫“大明”。?
這時他已經不是那個只會做100以內加法的那個“小明”了,現在他甚至會任意長度的正小數的加法。?
現在,給你兩個正的小數A和B,你的任務是代表大明計算出A+B的值。?
?
Input
本題目包含多組測試數據,請處理到文件結束。?
每一組測試數據在一行里面包含兩個長度不大于400的正小數A和B。
?
Output
請在一行里面輸出輸出A+B的值,請輸出最簡形式。詳細要求請見Sample Output。?
?
Sample Input
1.1 2.9
1.1111111111 2.3444323343
1 1.1?
?
Sample Output
4
3.4555434454
2.1?
/*這道題原理超級簡單,唉...不過還是卡了我很久,做這道題的關鍵就是細心細心再細心,因為這道題要用到很多變量,特別容易混亂...*/ /*AC*/ #include<stdio.h> #include<string.h> int main() {char a[410],b[410];int za[410],zb[410],xa[410],xb[410],sz[410],sx[410];while (scanf("%s%s",a,b)!=EOF){memset(za,0,sizeof(za));memset(zb,0,sizeof(zb));memset(xa,0,sizeof(xa));memset(xb,0,sizeof(xb));memset(sz,0,sizeof(sz));memset(sx,0,sizeof(sx));int lena=strlen(a),lenb=strlen(b);int i,j,ka,kb;ka=lena; //初始小數點位置默認為無kb=lenb; //初始小數點位置默認為無/*** 找小數的位置**/for (i=0;i<lena;i++){if (a[i]=='.'){ka=i;break;}}for (i=0;i<lenb;i++){if (b[i]=='.'){kb=i;break;}}/** *分離出整數**/for (i=ka-1,j=0;i>=0;i--,j++)za[j]=a[i]-'0';for (i=kb-1,j=0;i>=0;i--,j++)zb[j]=b[i]-'0';/*** 分離出小數部分**/if (ka<lena){for (i=ka+1,j=0;i<lena;i++,j++)xa[j]=a[i]-'0';}if (kb<lenb){for (i=kb+1,j=0;i<lenb;i++,j++)xb[j]=b[i]-'0';}/*** 小數部分相加**/int c=0,mx,mz,num=0;if (ka<lena||kb<lenb){mx=lena-ka-1>lenb-kb-1?lena-ka-1:lenb-kb-1;for (i=mx-1;i>=0;i--){sx[i]=(xa[i]+xb[i]+c)%10;c=(xa[i]+xb[i]+c)/10;}/*** 統計尾部的0的個數**/int flag=0;for (i=mx-1;i>=0;i--){if (sx[i]==0&&!flag){num++;continue;}flag=1;}}/*** 整數部分相加**/mz=ka>kb?ka:kb; //找到A,B兩個數小數位數多的那個for (i=0;i<mz;i++){sz[i]=(za[i]+zb[i]+c)%10; //這里的c能接收小數進到整數的進位c=(za[i]+zb[i]+c)/10;}if (c){sz[mz]=c;mz+=1;}for (i=mz-1;i>=0;i--)printf("%d",sz[i]);if ((ka<lena||kb<lenb)&&num<mx) //解釋一下,這里的條件有點復雜,(ka<lena||kb<lenb)指的是A或B中至少有一個是小數,{ //num<mx表示小數點后面的0的個數沒有超過小數的最大位數,說明小數點后面還有非0的數printf(".");for (i=0;i<mx-num;i++)printf("%d",sx[i]);}printf("\n");}return 0; }
Description
話說,經過了漫長的一個多月,小明已經成長了許多,所以他改了一個名字叫“大明”。?
這時他已經不是那個只會做100以內加法的那個“小明”了,現在他甚至會任意長度的正小數的加法。?
現在,給你兩個正的小數A和B,你的任務是代表大明計算出A+B的值。?
?
Input
本題目包含多組測試數據,請處理到文件結束。?
每一組測試數據在一行里面包含兩個長度不大于400的正小數A和B。
?
Output
請在一行里面輸出輸出A+B的值,請輸出最簡形式。詳細要求請見Sample Output。?
?
Sample Input
1.1 2.9
1.1111111111 2.3444323343
1 1.1?
?
Sample Output
4
3.4555434454
2.1?
/*這道題原理超級簡單,唉...不過還是卡了我很久,做這道題的關鍵就是細心細心再細心,因為這道題要用到很多變量,特別容易混亂...*/ /*AC*/ #include<stdio.h> #include<string.h> int main() {char a[410],b[410];int za[410],zb[410],xa[410],xb[410],sz[410],sx[410];while (scanf("%s%s",a,b)!=EOF){memset(za,0,sizeof(za));memset(zb,0,sizeof(zb));memset(xa,0,sizeof(xa));memset(xb,0,sizeof(xb));memset(sz,0,sizeof(sz));memset(sx,0,sizeof(sx));int lena=strlen(a),lenb=strlen(b);int i,j,ka,kb;ka=lena; //初始小數點位置默認為無kb=lenb; //初始小數點位置默認為無/*** 找小數的位置**/for (i=0;i<lena;i++){if (a[i]=='.'){ka=i;break;}}for (i=0;i<lenb;i++){if (b[i]=='.'){kb=i;break;}}/** *分離出整數**/for (i=ka-1,j=0;i>=0;i--,j++)za[j]=a[i]-'0';for (i=kb-1,j=0;i>=0;i--,j++)zb[j]=b[i]-'0';/*** 分離出小數部分**/if (ka<lena){for (i=ka+1,j=0;i<lena;i++,j++)xa[j]=a[i]-'0';}if (kb<lenb){for (i=kb+1,j=0;i<lenb;i++,j++)xb[j]=b[i]-'0';}/*** 小數部分相加**/int c=0,mx,mz,num=0;if (ka<lena||kb<lenb){mx=lena-ka-1>lenb-kb-1?lena-ka-1:lenb-kb-1;for (i=mx-1;i>=0;i--){sx[i]=(xa[i]+xb[i]+c)%10;c=(xa[i]+xb[i]+c)/10;}/*** 統計尾部的0的個數**/int flag=0;for (i=mx-1;i>=0;i--){if (sx[i]==0&&!flag){num++;continue;}flag=1;}}/*** 整數部分相加**/mz=ka>kb?ka:kb; //找到A,B兩個數小數位數多的那個for (i=0;i<mz;i++){sz[i]=(za[i]+zb[i]+c)%10; //這里的c能接收小數進到整數的進位c=(za[i]+zb[i]+c)/10;}if (c){sz[mz]=c;mz+=1;}for (i=mz-1;i>=0;i--)printf("%d",sz[i]);if ((ka<lena||kb<lenb)&&num<mx) //解釋一下,這里的條件有點復雜,(ka<lena||kb<lenb)指的是A或B中至少有一個是小數,{ //num<mx表示小數點后面的0的個數沒有超過小數的最大位數,說明小數點后面還有非0的數printf(".");for (i=0;i<mx-num;i++)printf("%d",sx[i]);}printf("\n");}return 0; }
總結
- 上一篇: 口语999句
- 下一篇: EfficientNet-V2 论文以及