1. 程式人生 > >hdoj 1002 sum problem(超大數相加)

hdoj 1002 sum problem(超大數相加)

思路:因為是超大數,所以要用字元陣列進行儲存,並且在陣列的基礎上進行計算

程式碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
	char a[1010];							
	char b[1010];
	int  num1[1000];
	int  num2[1000];
	int  sum[1001];
	int  num1_len;
	int  num2_len;
	int t;
	int t1;
	int i;
	int x;
	int y;
	
	scanf("%d",&t);									
	for(t1=1;t1<=t;t1++)							//陣列初始化,避免影響下一次迴圈 
	{
		memset(num1,0,sizeof(int)*1001);
		memset(num2,0,sizeof(int)*1001);
		memset(sum,0,sizeof(int)*1001);
		for(i=0;i<1010;i++)
		{
			a[i]='\0';
			b[i]='\0';
			
				
		} 										
		x=0;
		scanf("%s %s",a,b);
		
		num1_len=strlen(a);
		num2_len=strlen(b);
		for(i=num1_len-1;i>=0;i--)					//反序儲存  
		{
			num1[i]=(int)a[x]-(int)'0';
			x++;
		}
		x=0;
		for(i=num2_len-1;i>=0;i--)					//反序儲存  
		{
			num2[i]=(int)b[x]-(int)'0';
			x++;
		}
		
		if(num1_len>=num2_len)						//小學加法進位 
		{
			
			for(i=0;i<num1_len;i++)
			{
				if(num1[i]+num2[i]>9)
				{
					sum[i]+=num1[i]+num2[i]-10;
					sum[i+1]++;
				}
				else
				{
					sum[i]+=num1[i]+num2[i];
				}
			}
		}
		else
		{
			for(i=0;i<num2_len;i++)
			{
				if(num1[i]+num2[i]>9)
				{
					sum[i]+=num1[i]+num2[i]-10;
					sum[i+1]++;
				}
				else
				{
					sum[i]+=num1[i]+num2[i];
				}
			}
		}
		
		printf("Case %d:\n",t1);
		printf("%s + %s = ",a,b);
		for(i=1000;i>=0;i--)						//判斷sum陣列從哪一位開始最後的結果的第一個數 
		{
			if(sum[1000]==1)
			{
				y=1000;
				break;
			}
				
				
			if(sum[i]==0 && sum[i-1]!=0)
			{
				y=i-1;
				break;
			}
		}
		for(i=y;i>=0;i--)								//輸出最後的結果 
		{
			printf("%d",sum[i]);
		}
		printf("\n");
		if(t1!=t)
			printf("\n");		
	}
	
	
	return 0;
}