个人大数加法模版 c++

第一次手写大数加法模版,很菜。。不考虑负数的 下次把负数的也补齐

洛谷 P1601

#include<cstdio>
#include<iostream>
#include<stack>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=105;
string judge(string a)
{
    int cnt=0;
    for(int i=0;i<a.length();i++) if(a[i]=='0') cnt++;
    if(cnt==a.length()) a="0";
    return a;
}
int main()
{
    string a,b;
    int m[2000],n[2000],ans[2000];
    int cnt=1;
    //while(t--)
    
        cin>>a>>b;
        memset(m,0,sizeof(m));memset(n,0,sizeof(n));memset(ans,0,sizeof(ans));
        ///cout<<"Case "<<cnt++<<":"<<endl;
        //for(int i=0;i<a.length();i++) cout<<a[i];
        //cout<<" + ";
        //for(int i=0;i<b.length();i++) cout<<b[i];
        //cout<<" = ";
        a=judge(a);b=judge(b);
        for(int i=a.length()-1,j=0;i>=0;i--,j++) m[j]=a[i]-'0';
        for(int i=b.length()-1,j=0;i>=0;i--,j++) n[j]=b[i]-'0';
        int d=max(a.length(),b.length());
        for(int i=0;i<d;i++)
        {
            if(m[i]+n[i]+ans[i]>=10)
            {
                ans[i]=(m[i]+n[i]+ans[i])-10;
                ans[i+1]++;
            }
            else if((m[i]+n[i]+ans[i])<10) ans[i]=m[i]+n[i]+ans[i];
        }
        if(ans[d]==0) for(int i=d-1;i>=0;i--) cout<<ans[i];
        else if(ans[d]!=0) for(int i=d;i>=0;i--) cout<<ans[i];
        cout<<endl;
        memset(m,0,sizeof(m));memset(n,0,sizeof(n));memset(ans,0,sizeof(ans));
    return 0;
}

51nod 1005

#include<stdio.h>
#include<string.h>
#define max 10006
int fun(char a[],char b[]);
int main()
{
	char a[max],b[max];
	scanf("%s%s",a,b);
	fun(a,b);
	return 0;
}
int fun(char a[],char b[])
{
	int c[max];
	int k=0,i,j,lena,lenb,t;
	int flaga=0,flagb=0,signa=1,signb=1,flag=0;
	lena=strlen(a);
	lenb=strlen(b);
    if(a[0]=='-'&&b[0]=='-')
	{
		flag=1;
		flaga=flagb=1;
	}
	else if(a[0]=='-'||b[0]=='-')
	{
		if(a[0]=='-')
			flaga=1;
		else
			flagb=1;
		if(lena-flaga>lenb-flagb)
			signb=-1;
		else if(lena-flaga<lenb-flagb)
			    signa=-1;
		else
		{
			if(strcmp(&a[flaga],&b[flagb])>0)
				signb=-1;
			else if(strcmp(&a[flaga],&b[flagb])<0)
				    signa=-1;
			else
			{
				printf("0\n");
				return 0;
			}

		}
		if(flaga==1&&signb==-1)
			flag=1;
		else if(flagb==1&&signa==-1)
			   flag=-1;
	}
	t=0;
	for(i=lena-1,j=lenb-1;i>=flaga||j>=flagb;i--,j--)
	{
		if(i>=flaga&&j>=flagb)
			c[k++]=(a[i]-'0')*signa+(b[j]-'0')*signb+t;
		else if(i>=flaga&&j<flagb)
			    c[k++]=a[i]-'0'+t;
		     else if(i<flaga&&j>=flagb)
				    c[k++]=b[j]-'0'+t;
	    if(c[k-1]>9)
		{
			c[k-1]-=10;
			t=1;
		}
		else if(c[k-1]<0)
		{
			c[k-1]+=10;
			t=-1;
		}
		else
			t=0;
	}
	if(t==1)
		c[k++]=1;
	while(!c[k-1]&&(k-1)!=0) k--;
	if(flag)
		printf("-");
	for(i=k-1;i>=0;i--)
		printf("%d",c[i]);
	printf("\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wzazzy/article/details/81028906