poj 1503 Integer Inquiry【高精度】
这题总算是没有那么水的感觉了,不过还是水题,哈哈哈。。。题目主要是求高精度----大数的和,我专门写了一个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;
}
最后更新:2017-04-03 14:53:41