1. 程式人生 > >NYOJ A+B IV 小數相加(大數問題)

NYOJ A+B IV 小數相加(大數問題)

A+B Problem IV

時間限制:1000 ms  |  記憶體限制:65535 KB 難度:3
描述
acmj最近發現在使用計算器計算高精度的大數加法時很不方便,於是他想著能不能寫個程式把這個問題給解決了。
輸入
包含多組測試資料
每組資料包含兩個正數A,B(可能為小數且位數不大於400)
輸出
每組輸出資料佔一行,輸出A+B的結果,結果需要是最簡的形式。
樣例輸入
1.9 0.1
0.1 0.9
1.23 2.1
3 4.0
樣例輸出
2
1
3.33
7
思路:把兩個數當字串輸入,存放到兩個陣列中。再檢測是否有小數點,開兩個陣列大小為前面兩倍,中間一個位置存放小數點,小數點左邊存放小數部分,小數點右邊存放整數部分(倒著存放)。然後兩個倒序後的陣列相加,用第三個同等大小的陣列存放結果。同時檢測整數部分前面的零和小數部分後面的零,去掉多餘的零。詳細看程式碼部分。
#include<stdio.h>
#include<string.h>
char s1[410],s2[410];
int a1[820],b1[820];
char result[820];
void create(char *s,int *a)
{
	int len=strlen(s);
	int k;
	if(strchr(s,'.')!=NULL) //判斷有無小數點 
	k=strchr(s,'.')-s; //標記小數點的位置 
	else
	k=len;             // 無小數點 
	for(int i=k+1,j=399;i<len;i++,j--)//小數點後面的存到前四百位
	a[j]=s[i]-'0'; 
	for(int i=k-1,j=400;i>=0;i--,j++)//小數點前面的存放到後四百位 
	a[j]=s[i]-'0';	
} 
void init()
{
	memset(a1,0,sizeof(a1));
	memset(b1,0,sizeof(b1));
	memset(result,0,sizeof(result));
}
void sum()
{
	int s,v=0;
	for(int i=0;i<820;i++)
	{
	    s=a1[i]+b1[i]+v;
		result[i]=s%10;
		v=s/10;
	} 
}
void print()
{
	int i=820;
	while(result[i]==0&&i>=400)
	{
		i--;
	}
	int j=0;
	while(result[j]==0&&j<400)
	{
		j++;
	}
	if(i==399&&j==400)//全是零的情況
	printf("0\n");
	else
	{
		for(;i>=400;i--)
		{
			printf("%d",result[i]);
		}
		if(j!=400)
		{
		printf(".");
		}
		for(int i=399;i>=j;i--)	
		printf("%d",result[i]); 
		printf("\n");	 
	}
}
int main()
{
while(~scanf("%s %s",s1,s2))
{
	init(); //每計算一次初始化陣列
	create(s1,a1);//轉化過程(2倍陣列倒序存放小數或整數)
	create(s2,b1);//轉化過程 
	sum();//進位求和過程 
	print();
}
	return 0;
}