poj 1503 Integer Inquiry【高精度】

来源:互联网 发布:大学生网络兼职论坛 编辑:程序博客网 时间:2024/05/18 01:31

这题总算是没有那么水的感觉了,不过还是水题,哈哈哈。。。题目主要是求高精度----大数的和,我专门写了一个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;//反转VeryLongIntegersint 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]++;}elsesum[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 105string 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;}