大数的加法与乘法

1.大数的加法

核心:把大数考虑变成以每一位来看的数组。使用char型数组将数字以字符串的形式存入,然后通过每个-48(-‘0’)进行强制转化为Int型,用两个新的数组对强制转化的每一次进行记录(注意倒叙记录,因为是按每一位来看的,这样a[0]应该从最后一位开始,然后相加后前一位进一刚好可以e[i+1]++来实现)使用数组e对其每个元素(倒叙的两个数组的每一位)进行求和。如果>10,e[i+1]++;这样实现,最后倒叙输出e[i]即可完成。

代码实现:

#include<stdio.h>
#include<string.h>
main()
{
	char a[1000],b[1000];
	scanf("%s%s",a,b);
	int c[1000]={0},d[1000]={0},e[1000]={0};
	int a1=strlen(a);   
	int a2=strlen(b);
	int a3=a1-1;       
	int a4=a2-1; //将字符串倒序
	for(int i=0; i<a1; i++)
{         
   c[a3]=(a[i]-48);   
        a3--;   
}      
    for(int i=0; i<a2; i++) 
{          
   d[a4]=(b[i]-48); 
   a4--;      
}      
   int l;
   if(a1>=a2)
   l=a1;
   else
   l=a2;
    for(int i=0; i<l; i++) 
{    
     e[i]+=(c[i]+d[i]);   //对两组字符串中的数逐位相加,存于e[i]         
     if(e[i]>=10)         // 得到的结果进行进制位处理 
{              
   e[i+1]++;             
 e[i]=e[i]%10;    
}    
} 
printf("%s + %s = ",a,b);  
    if(e[l]!=0)        
    printf("%d",e[l]);        
	  for(int i=l-1; i>=0; i--)  
{       
	     printf("%d",e[i]);   
}     

}

2.大数的乘法

前面的操作一样,转化,倒叙记录。通过两个for保证两个数组中的数每个都与另外一个相乘后i+j相同的相加,保存于数组(e[i+j]+=(c[i]*d[j]);)通过循环把00000561654这样的前面的0删除,后直接输出即可,今天初次接触,后面有可能遗忘,还需多加练习。

代码实现:

#include<stdio.h>
#include<string.h>
main()
{
	char a[1000],b[1000];
	gets(a);
	gets(b);
	int c[1000]={0},d[1000]={0},e[1000]={0};
	int a1=strlen(a);
	int a2=strlen(b);
	int a3=a1-1;
	int a4=a2-1;
	int i,j;
	for(i=0;i<a1;i++)
	{
		c[a3]=(a[i]-48);
		a3--;
	}
	for(i=0;i<a2;i++)
	{
		d[a4]=(b[i]-48);
		a4--;
	}
	for(i=0;i<a1;i++)
	{
		for(j=0;j<a2;j++)
		{
			 e[i+j]+=(c[i]*d[j]);
		}
	}
	for( j=0; j<1000 ;j++)
	{
	if(e[j]>=10)
{
    e[j+1]+=e[j]/10;
    e[j]%=10;
            }
}

        //除去多余的0
        for(i=999; i>=0; i--)
        {
            if(e[i]!=0)
                break;
        }
        for(; i>=0; i--)  
{       
	     printf("%d",e[i]);   
}     


}

猜你喜欢

转载自blog.csdn.net/m0_46110288/article/details/105893777
今日推荐