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;
}


你可能感兴趣的:(poj 1503 Integer Inquiry【高精度】)