HDU1753: 大明A+B
生活随笔
收集整理的這篇文章主要介紹了
HDU1753: 大明A+B
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
大明A+B
Time Limit: 3000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5533????Accepted Submission(s): 1870
Problem Description 話說,經(jīng)過了漫長的一個(gè)多月,小明已經(jīng)成長了許多,所以他改了一個(gè)名字叫“大明”。 這時(shí)他已經(jīng)不是那個(gè)只會(huì)做100以內(nèi)加法的那個(gè)“小明”了,現(xiàn)在他甚至?xí)我忾L度的正小數(shù)的加法。現(xiàn)在,給你兩個(gè)正的小數(shù)A和B,你的任務(wù)是代表大明計(jì)算出A+B的值。 Input 本題目包含多組測(cè)試數(shù)據(jù),請(qǐng)?zhí)幚淼轿募Y(jié)束。 每一組測(cè)試數(shù)據(jù)在一行里面包含兩個(gè)長度不大于400的正小數(shù)A和B。 Output 請(qǐng)?jiān)谝恍欣锩孑敵鲚敵鯝+B的值,請(qǐng)輸出最簡形式。詳細(xì)要求請(qǐng)見Sample Output。 Sample Input 1.1 2.9 1.1111111111 2.3444323343 1 1.1 Sample Output 4 3.4555434454 2.1 1 /* 2 帶小數(shù)點(diǎn)的大數(shù)加法 3 思路清晰簡單,幾分鐘就想清楚 4 但敲代碼1個(gè)多小時(shí),改錯(cuò)又是1個(gè)半小時(shí) 汗…… 5 要提高敲鍵盤的速度以及正確率啊,還有就是敲之前一定要想清楚 6 */ 7 8 #include <iostream> 9 #include <string.h> 10 #include <stdio.h> 11 #include <math.h> 12 using namespace std; 13 const int MAX=1000; 14 char que[3][MAX]; //存入初始字符串 15 int data[3][MAX]; //存入字符串轉(zhuǎn)換過來的數(shù)據(jù) 16 int answer[MAX]; //最后的答案 17 int main() 18 { 19 int len[3]; //兩字符串長度 20 int dian[3]; //字符串轉(zhuǎn)換成實(shí)數(shù)后小數(shù)點(diǎn)的位置 21 while(scanf("%s%s",que[1],que[2])!=EOF) 22 { 23 memset(data,0,sizeof(data)); 24 memset(answer,0,sizeof(answer)); 25 len[1]=strlen(que[1])-1; 26 len[2]=strlen(que[2])-1; 27 //printf("len %d %d\n",len[1],len[2]); 28 //printf("%s %s\n",que[1],que[2]); 29 dian[1]=-1; 30 dian[2]=-1; 31 32 //for循環(huán)將字符串轉(zhuǎn)換成實(shí)數(shù),并找出小數(shù)點(diǎn)的位置 33 for(int i=1;i<3;i++) 34 for(int j=len[i];j>=0;j--) 35 { 36 if(que[i][j]=='.') 37 dian[i]=len[i]-j; 38 else 39 data[i][len[i]-j]=que[i][j]-'0'; 40 } 41 /* 42 檢驗(yàn)數(shù)據(jù)的轉(zhuǎn)換是否完成以及小數(shù)點(diǎn)的位置 43 for(int i=0;i<=len[1];i++) 44 printf("%d ",data[1][i]); 45 printf("\n"); 46 for(int i=0;i<=len[2];i++) 47 printf("%d ",data[2][i]); 48 printf("\n"); 49 printf("%d %d\n",dian[1],dian[2]); 50 */ 51 52 //將兩個(gè)實(shí)數(shù)的小數(shù)點(diǎn)對(duì)齊 53 int sub; 54 if(dian[1]>dian[2]) 55 { 56 sub=dian[1]-dian[2]; 57 for(int j=len[2]+sub;j>=0;j--) 58 { 59 if(j>=sub) 60 data[2][j]=data[2][j-sub]; 61 else 62 data[2][j]=0; 63 dian[2]=dian[1]; 64 } 65 } 66 if(dian[2]>dian[1]) 67 { 68 sub=dian[2]-dian[1]; 69 for(int j=len[1]+sub;j>=0;j--) 70 { 71 if(j>=sub) 72 data[1][j]=data[1][j-sub]; 73 else 74 data[1][j]=0; 75 dian[1]=dian[2]; 76 } 77 } 78 79 /* 80 //小數(shù)點(diǎn)轉(zhuǎn)換完成后的實(shí)數(shù)數(shù)據(jù)以及小數(shù)點(diǎn)的位置 81 for(int i=0;i<=len[1]+sub;i++) 82 printf("%d ",data[1][i]); 83 printf("\n"); 84 for(int i=0;i<=len[2]+sub;i++) 85 printf("%d ",data[2][i]); 86 printf("\n"); 87 printf("dian %d %d\n",dian[1],dian[2]); 88 */ 89 for(int i=0;i<2+len[1]+len[2];i++) 90 { 91 answer[i]=data[1][i]+data[2][i]; 92 //printf("%d ",answer[i]);//兩數(shù)相加但是并不進(jìn)位 93 } 94 //printf("\n"); 95 96 //進(jìn)位處理,注意小數(shù)點(diǎn)在進(jìn)位時(shí)的影響 97 for(int i=0;i<2+len[1]+len[2];i++) 98 { 99 if(i+1==dian[1]) 100 { 101 answer[i+2]+=answer[i]/10;//跳過小數(shù)點(diǎn)位置進(jìn)位 102 answer[i]=answer[i]%10; 103 i++; 104 } 105 else 106 { 107 answer[i+1]+=answer[i]/10; 108 answer[i]=answer[i]%10; 109 } 110 } 111 //令小數(shù)點(diǎn)位置處為零,防止尋找s時(shí)造成影響 112 if(dian[1]>=0) 113 answer[dian[1]]=0; 114 int s,t; 115 //尋找數(shù)據(jù)輸出的最低位 116 for(s=0;s<=dian[1];s++) 117 if(answer[s]!=0) 118 break; 119 //尋找數(shù)據(jù)輸出的最高位 120 for(t=len[1]+len[2]+2;t>dian[1];t--) 121 if(answer[t]!=0) 122 break; 123 //printf("s=%d t=%d\n",s,t); 124 //若相加兩數(shù)均為整數(shù),則個(gè)位為最低位,輸出時(shí)無小數(shù)點(diǎn) 125 if(dian[1]==-1) 126 s=0; 127 128 for(int i=t;i>=s;i--) 129 { 130 if(i==dian[1]) 131 printf("."); 132 else 133 printf("%d",answer[i]); 134 } 135 136 printf("\n"); 137 138 } 139 //cout << "Hello world!" << endl; 140 return 0; 141 }
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/caoyuanlang/archive/2013/01/14/2860146.html
總結(jié)
以上是生活随笔為你收集整理的HDU1753: 大明A+B的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zencart 给DHL运费模块增加一个
- 下一篇: 通过爬虫等手段,免费获取非小号和coin