hdoj1002解題報告(大數入門)


引言 : int最大能表示的數約在10^9,最大的long long也只能存儲約在10^19范圍內的數。那怎么進行大數的運算呢,拿起草稿紙,做一個加法運算,看看會有哪些步驟。

題解 :

用字符數組來存儲大數,每一位當做一個字符,可以開多大的數組,就能計算多少位的數。

舉個栗子,計算99999999999+1.  直接用int,答案顯然是錯的。用兩個字符數組

s1 :

 9 9 9 9 9 9 9 9 9 9 9 \0

s2 :

 1 \0

再用字符數組s來存儲兩數之和,顯然s最長為s1的長度加1。從最低位依次模擬加法,注意進位,注意字符0與數字0的區別,注意數組從0開始。

s:

1 0 0 0 0 0 0 0 0 0 \0

#include<stdio.h>
#include<string.h>

void  Bignum_add(char * s1,char * s2,char *s)
{    int i,j,a,l1,l2,L,t;
    
    l1=strlen(s1);
    l2=strlen(s2);
    s[0]='0';
    a=0;
    if(l1>l2) L=l1;  
    else L=l2; 
	s[L+1]='\0';     
    for(i=L;l1>0&&l2>0;i--)
    {
        a=(s1[--l1]-'0')+(s2[--l2]-'0')+a/10;
        s[i]=a%10+'0';
    }
    while(l1){
        a=(s1[--l1]-'0')+a/10;
        s[i--]=a%10+'0';
            }
    while(l2){
        a=(s2[--l2]-'0')+a/10;
        s[i--]=a%10+'0';
            }
    s[i]=a/10+'0';
    
    t=0;
    while(s[t]=='0'&&t<L) t++;  
    
    strcpy(s,s+t);    //比如,將000001化成1
}

int main()
{	int T,d=1;
	char s[1000],s1[1000],s2[1000];
	scanf("%d",&T);
	while(T--)
	{	scanf("%s%s",s1,s2);
		Bignum_add(s1,s2,s);
		printf("Case %d:\n",d++);	
		printf("%s + %s = %s\n",s1,s2,s);
		if(T!=0) printf("\n");
		
	} 
 
 return 0;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM