这题总算是没有那么水的感觉了,不过还是水题,哈哈哈。。。题目主要是求高精度----大数的和,我专门写了一个add函数处理,sum和VeryLongIntegers是两个全局的变量,开始我还准备把sum也写成char型的字符串,但是考虑到结尾的‘\0’,那不是自找麻烦。。果断换成int型数组,这样就容易处理多了。
在add函数中,我把VeryLongIntegers又反转了一次(即变成低位在前),也换成一个int型的数组,这样就变成两个int型数组的高精度加法了。。。
开始还觉得可能会WA一次,不过运气是十分之好,一次AC,再接再厉咯。。。
忘说一句,题目的数据可能会有些变态,以0开头。。。如果判断VeryLongIntegers【0】==‘0’,就悲剧了
我的AC代码
#include <stdio.h> #include <string.h> //变态的题目允许以0开头 char VeryLongIntegers[105]; int sum[105]; //直接用int来放加后的结果,没必要再用char型增加难度 //反转之后的VeryLongIntegers和sum都是从低位到高位存放,==打印时要注意 void add() { int i; //反转VeryLongIntegers int vers[105]={0}; int j=0; for(i=strlen(VeryLongIntegers)-1;i>=0;i--) { vers[j]=VeryLongIntegers[i]-'0'; j++; //printf("%d",vers[j-1]); //反转OK } //这就变成了两个int数组的大数加法了 int temp; for(i=0;i<strlen(VeryLongIntegers);i++) { temp=vers[i]+sum[i]; if(temp>=10) { sum[i]=temp-10; sum[i+1]++; } else sum[i]=temp; } } int main() { int i=0; while(scanf("%s",VeryLongIntegers)) { if(strcmp(VeryLongIntegers,"0")==0) break; add(); i++; } //如果前面都是0,就继续往前数 int j=103; while(sum[j]==0) { j--; } for(i=j;i>=0;i--) printf("%d",sum[i]); printf("\n"); return 0; }
后来又看了别人的结题报告 ,用STL真的很爽,string已经写成一个类了,很多函数直接调用
别人的代码
#include <iostream> #include <string> using namespace std; #define SIZE 105 string s; int sum[SIZE]={0}; int main() { int i,j; while(cin>>s&&s.compare("0")) { for(j=SIZE-1,i=s.size()-1;i>=0;--i) sum[j--]+=(s[i]-'0'); } j=0;//处理时去除前面的零 while(!sum[j]) ++j; if(j>=SIZE) printf("0"); for(i=SIZE-1;i>=j;i--)//处理进位 { sum[i-1]+=sum[i]/10; sum[i]=sum[i]%10; } i=0;//输出前去除前面的零 while(!sum[i]) ++i; for(;i<SIZE;i++) cout<<sum[i]; cout<<endl; }