大数乘(正整数)

大数乘(正整数)

My   solution:

/*2015.10.31*/

#include<stdio.h>
#include<string.h>
int t1[100],t2[100],t3[1000]; 
char c1[100],c2[100];
int main()
{
	int i,j=0,m1,m2,k=0,g;
	gets(c1);
	gets(c2);
	memset(t3,0,sizeof(t3));
	m1=strlen(c1);
	m2=strlen(c2);
	for(i=m1-1;i>=0;i--)
	{
			t1[j++]=c1[i]-'0';
	 } 
	j=0;
	for(i=m2-1;i>=0;i--)
	{
			t2[j++]=c2[i]-'0';
	}
	for(i=0;i<m1;i++)
	{
		k=i;/*当t1数组中的第i个元素和t2整个数组相乘时,把求得的结果按位依次存放在以i为下标起点的t3数组中,见下图*/
		for(j=0;j<m2;j++)           
		{                          
			t3[k++]+=t1[i]*t2[j];  
		}	                       
	}     	                          
	for(i=0;i<k;i++)           
	{                          
		if(t3[i]>9)               
		{                        
			g=t3[i]/10;
			t3[i]%=10;
			if(i==k-1)/*考虑最高位进位,所以数组长度也要增加,可能某个数组元素为3位数,例124,则原则上需连续两次进位*/ 
			{         /*,但实际只需进一次位即12,12加入到新的数组元素中再通过上述循环继续进位就解决了*/
				k+=1;	
			}	
			t3[i+1]+=g;
		}
	}
	for(i=k-1;i>=0;i--)
	printf("%d",t3[i]);
	return 0;
}
   /* 如:      t3[4]          t3[5]         t3[6]
(上述程序:)      124            56             0
                  4           12+56=68         0
                  4             8              6
              
              
  较复杂方法:4+2*10+1*100      5*10+6        0 
                 4              2+6+5*10      1 
                 4                2+6         1+5 
   */ 
   
             
        //下标:  6      5       4       3       2     1       0
      // t2元素:        2       3       5       4     8       6 
       //t1元素:                         4       3     1       2       
//第一次相乘结果:         *       *       *       *     *       *(i=0) 
//第二次相乘结果:  *      *       *       *       *     *         (i=1)       
//第三次。。。。。。               *       *       *              (i=2) 
//第四次 ..........               *       *                      (i=3)
//把四次结果相加放入t3数组中......... 
//再考虑进位。 
类似:
     243
    X 21
__________
     243
    486
——————
    5103



                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值