| 
                         
        
             12*34=?  乘数:12  被乘数:34  
  先把乘数列出来,第i行列左起第i位数,列N次(N为乘数的位数)  第二行起每次右移一位  (1) (1)  ??? (2) (2)  
写入被乘数,按先列后行的方式  (1,3) (1,4)  ????? (2,3) (2,4)  
将()内的数两乘  (1,3=3) (1,4=4)  ??????? (2,3=6) (2,4=8)  
相加,注意进位  (1,4=8)  -------------------------  ???? 3????? 10?????? 8  ???????? .??????????  -------------------------  ???? 4?????? 0?????? 8  
12*34=408  
再看三位数乘法  
123*456=?  
第一步:  (1) (1) (1)  ??? (2) (2) (2)  ??????? (3) (3) (3)?  
第二步:  (1,4) (1,5) (1,6)  ????? (2,4) (2,5) (2,6)  ??????????? (3,4) (3,5) (3,6)  
第三步:  (1,4= 4) (1,5= 5) (1,6= 6)  ???????? (2,4= 8) (2,5=10) (2,6=12)  ????????????????? (3,4=12) (3,5=15) (3,6=18)  
第四步:  (1,6=18)  ----------------------------------------------  ????? 4?????? 13?????? 28?????? 27?????? 18  ?????????? .??????? .??????? .??????? .  ----------------------------------------------  ????? 5??????? 6??????? 0??????? 8??????? 8  
123*456=56088  
??? 分析一下每一位的值是如何计算出来的,以下说的位都是从个位算起:  结果的第i位,是乘数的第i位乘以被乘数的1位,再加上乘数的第i-1位乘  以被乘数的第2位,一起加到乘数的第1位乘以被乘数的第i位。这样描述起  来有点不明白,画个图就很清楚了:  123*456的第3位:从乘数的第3位(1)起到第1位(3),按从右向左的方式  逐个乘以被乘数:  1*6+2*5+3*4=28  
再把进位加上就可以了。  到这里,已经可以得出一个通用的计算方法,把结果逐位计算出来。  
? ?通过上面的分析,我们知道了算法的核心思想,接下来就能把算法实现,实现方法如下:  
 
 
  
   
   [cpp]? 
   view plain 
   ?copy 
    
    
    
   
  
  
-  #include?"iostream"??
  
  -  ??
  
  -  using?namespace?std;??
  
  -  #define?N?100??
  
  -  ??
  
  -  void?char_to_int(int?*a?,?char*?ch){??
  
  -  ????int?len?=?strlen(ch);??
  
  -  ????int?i?=?0,?term?=?0;??
  
  -  ????for(i?=?0?;?i?<?N?;?i++){??
  
  -  ????????a[i]?=?0;??
  
  -  ????}??
  
  - for(i?=?0?;?i?<?len?;?i++){??
  
  -  ????????term?=?ch[i];??
  
  -  ????????a[len-i-1]?=?(term?-?'0');??
  
  -  }???
  
  -  int?main()??
  
  -  {??
  
  - int?a[N],b[N],c[2*N];??
  
  - char?ch1[N],?ch2[N];??
  
  - int?i?=?0?,?j?=0;??
  
  -  ????cout<<"1:";??
  
  -  ????cin>>ch1;??
  
  -  ????cout<<"2:";??
  
  -  ????cin>>ch2; ?
  
  -  ????char_to_int(a?,?ch1);??
  
  -  ????char_to_int(b?,?ch2);??
  
  -  ??????
  
  - for(i?=?0?;?i?<?2*N?;?++i){??
  
  -  ????????c[i]?=?0;??
  
  -  ????for(i?=?0?;?i?<?N?;?++i){??
  
  -  ????????for(j?=?0?;?j?<?N?;?++j){??
  
  -  ????????????c[i+j]?+=?a[i]?*?b[j];??
  
  -  ????????}??
  
  -  ????}??
  
  - for(i?=?0?;?i?<?2*N?-1?;?++i){??
  
  -  ????????c[i+1]?+=?c[i]?/10;??
  
  -  ????????c[i]?=?c[i]?%?10;??
  
  -  ????j?=?2*N?-1;??
  
  - while(c[j]?==?0)????
  
  -  ???????????????j--;????
  
  - for(i?=?j;i?>=?0;?--i)????
  
  -  ???????????printf("%d",c[i]);????
  
  -  ????printf("n");????
  
  - return?0;????
  
  -  } ?
  
  
        
            
        	
                        (编辑:52站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |