任意长度的两个正整数相乘

题目:

       两个大数相乘:char* multiply(char*,char*)。给了两个字符串,每个都是代表了一个很长的10进制表示的数, 比如 String str1 = "23456789009877666555544444"; String str2 = "346587436598437594375943875943875", 最后求出它们的乘积。 不用jdk的数学运算包BigInteger.或者类似的包。


 

思考:

       这是一个大数相乘为题,大家都知道int、long等变量表示的数值有限,当出现超过这个限度的数值计算的时候,就是一个大数的计算问题,就需要用到数组了。
大致思想就是,把改进位的先保存,先不进位,保存到数组中,计算出"每一位“的值之后,在从"最低位"开始往高位进位。
之前写过c的代码:
  1. /*问题描述:当两个数比较大的时候就会出现溢出的现象。 
  2.   解决方案:利用数组来保存结果。*/  
  3.   
  4. #include <stdio.h>   
  5. #include <string.h>   
  6.   
  7. #define MAX 100   
  8. unsigned arr1[MAX+10];  
  9. unsigned arr2[MAX+10];  
  10. unsigned result[MAX*2+10];  
  11. char str1[MAX+10];  
  12. char str2[MAX+10];  
  13.   
  14.   
  15. int main()  
  16. {  
  17.     int len1 = 0, len2 = 0, len3 = 0, i, j = 0;  
  18.     int flag = 0;  
  19.     //   
  20.     memset(arr1, 0, sizeof(arr1));  
  21.     memset(arr2, 0, sizeof(arr2));  
  22.     memset(result, 0, sizeof(result));  
  23.   
  24.     //get函数   
  25.     gets(str1);  
  26.     gets(str2);  
  27.   
  28.     //计算实际长度   
  29.     len1 = strlen(str1);  
  30.     //printf("%d\n", len1);   
  31.     len2 = strlen(str2);  
  32.   
  33.     //把输入的数列反向转入数组,即最低位在数组的第一个位置[0]   
  34.     for(i = len1-1; i >= 0; i--)  
  35.     {  
  36.         arr1[j++] = str1[i] - '0';  
  37.     }  
  38.     j = 0;  
  39.     for(i = len2-1; i >= 0; i--)  
  40.     {  
  41.         arr2[j++] = str2[i] - '0';  
  42.     }  
  43.   
  44.     //   
  45.     for(i = 0; i < len2; i++)  
  46.     {  
  47.         for(j = 0; j < len1; j++)  
  48.         {  
  49.             result[i+j] += arr1[i]*arr2[j];  
  50.         }  
  51.     }  
  52.   
  53.     <SPAN style="COLOR: #ff0000">//进位</SPAN>   
  54.     for(i = 0; i < MAX*2; i++)  
  55.     {  
  56.         if(result[i] >= 10)  
  57.         {  
  58.             result[i+1] += result[i] / 10;//进十位数   
  59.             result[i] %= 10;//保留个位数   
  60.         }  
  61.     }  
  62.   
  63.     //输出结果(注意输出的时候把数组最后的一连串的0全部去掉)   
  64.   
  65.     for(i = MAX*2; i >= 0; i--)  
  66.     {  
  67.         if(flag)  
  68.         {  
  69.             printf("%d", result[i]);  
  70.         }  
  71.         else if(result[i])  
  72.         {  
  73.             printf("%d", result[i]);  
  74.             flag = 1;  
  75.         }  
  76.     }  
  77.     //   
  78.     if(!flag)  
  79.         printf("0");  
  80.     printf("\n");  
  81.       
  82.     return 0;  
  83. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值