大明A+B(1753)

話說,經過了漫長的一個多月,小明已經成長了許多,所以他改了一個名字叫“大明”。 
這時他已經不是那個只會做100以內加法的那個“小明”了,現在他甚至會任意長度的正小數的加法。 

現在,給你兩個正的小數A和B,你的任務是代表大明計算出A+B的值。 
 

Input

本題目包含多組測試數據,請處理到文件結束。 
每一組測試數據在一行裏面包含兩個長度不大於400的正小數A和B。
 

Output

請在一行裏面輸出輸出A+B的值,請輸出最簡形式。詳細要求請見Sample Output。 
 

Sample Input

1.1 2.9 1.1111111111 2.3444323343 1 1.1
 

Sample Output

4 3.4555434454

2.1

參考:利用1000的大空間來分段處理。

#include<cstdio>
#include<iostream>
#include<cstring>
#define Max 1010

char str1[Max],str2[Max],ans[Max],temp1[Max],temp2[Max];
void Calculate()
{
    int i,j,k,p,q,n,s,c;
    memset(str1,0,sizeof(str1));
    memset(str2,0,sizeof(str2));
    memset(ans,0,sizeof(ans));
    n=strlen(temp1);
    if(strchr(temp1,'.')==NULL)
        k=n;
    else
        k=strchr(temp1,'.')-temp1;
    for(i=k-1,j=500;i>=0;i--,j++)
        str1[j]=temp1[i]-'0';
    for(i=k+1,j=499;i<n;i++,j--)
        str1[j]=temp1[i]-'0';
    n=strlen(temp2);
    if(strchr(temp2,'.')==NULL)
        k=n;
    else
        k=strchr(temp2,'.')-temp2;
    for(i=k-1,j=500;i>=0;i--,j++)
        str2[j]=temp2[i]-'0';
    for(i=k+1,j=499;i<n;i++,j--)
        str2[j]=temp2[i]-'0';
    c=0;
    for(i=0;i<1010;i++)
    {
        s=str1[i]+str2[i]+c;
        ans[i]=s%10;
        c=s/10;
    }
    return ;
}
void Output()
{
    int i,j;
    for(i=1009;i>500;i--)
            if(ans[i])
                break;
        for(;i>=500;i--)
            printf("%d",ans[i]);
        for(j=0;j<500;j++)
            if(ans[j])
                break;
        if(j!=500)
        {
            printf(".");
            for(i=499;i>=j;i--)
                printf("%d",ans[i]);    
        }
        printf("\n");
}
int main()
{
    while(~scanf("%s %s",&temp1,&temp2))
    {
        Calculate();
        Output();
    }
    return 0;
}


自己的還沒找出錯誤:

//先將小數變成整數 
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <stack>
#include <set>
#include <map>
#include <string>
using namespace std;
#define pi acos(-1,0)
#define INF 2147483647
int max(int a,int b)
{
	return a>=b?a:b;
}

int main()
{
	int l1,l2,x1,x2,z1,z2,maxx,maxz;
	int i,j,flag;
	char s1[850],s2[850];
	int ss1[850],ss2[850];
	int ans[850];

	while(scanf("%s %s",s1,s2)!=EOF)
	{
		memset(ss1,0,sizeof(ss1));
		memset(ss2,0,sizeof(ss2));
		memset(ans,0,sizeof(ans));	
		l1=strlen(s1);
		l2=strlen(s2);
		flag=0;
		if(s1[0]=='0' && s2[0]=='0' && l1==l2 && l1==0)
		{
			printf("0\n");
			continue;
		}
		
		for(i=0;i<l1;i++)
		{
			if(s1[i]=='.')
			break;
		}
		if(i!=l1)
		{
			x1=l1-i-1;
			z1=i;
		}
		else
		{
			x1=0;
			z1=i;
		}
		for(i=0;i<l2;i++)
		{
			if(s2[i]=='.')
			break;
		}
		if(i!=l2)
		{
			x2=l2-i-1;
			z2=i;
		}
		else
		{
			x2=0;
			z2=i;
		}
		
		maxx=max(x1,x2);
		maxz=max(z1,z2);
		
		for(i=z1-1,j=0;i>=0;i--,j++)
		{
			ss1[maxz-j]=s1[i]-'0';
		}
		for(i=l1-x1,j=1;i<l1;i++,j++)
		{
			ss1[maxz+j]=s1[i]-'0';
		}
//		for(i=0;i<=maxx+maxz;i++)
//		printf("%d",ss1[i]);
		for(i=z2-1,j=0;i>=0;i--,j++)
		{
			ss2[maxz-j]=s2[i]-'0';
		}
		for(i=l2-x2,j=1;i<l2;i++,j++)
		{
			ss2[maxz+j]=s2[i]-'0';
		}
//		for(i=0;i<=maxx+maxz;i++)
//		printf("%d",ss2[i]);		
		
		for(i=maxx+maxz;i>0;i--)
		{
			if(ss1[i]+ss2[i]>9)
			{
				ss1[i-1]++;
				ans[i]=ss1[i]+ss2[i]-10;
			}
			else
			ans[i]=ss1[i]+ss2[i];
		}
		
		for(i=maxx+maxz;i>maxz;i--)
		{
			if(ans[i]!=0)
			{
				flag=1;
				break;
			}
		}
		
		for(i=maxx+maxz;i>=0;i--)
		{
			if(ans[i]!=0)
			break;
		}
		j=i;
		
		for(i=0;i<=j;i++)
		{
			if(i==0 && ans[0]!=0)
			printf("%d",ans[i]);
			else if(i==maxz && flag==1)
			{
				printf("%d",ans[i]);	
				printf(".");
			}			
			else if(i!=0)
			printf("%d",ans[i]);
			
		}	
		printf("\n");			
	}
	
	return 0;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章