题目:
两个大数相乘:char* multiply(char*,char*)。给了两个字符串,每个都是代表了一个很长的10进制表示的数, 比如 String str1 = "23456789009877666555544444"; String str2 = "346587436598437594375943875943875", 最后求出它们的乘积。 不用jdk的数学运算包BigInteger.或者类似的包。
思考:
这是一个大数相乘为题,大家都知道int、long等变量表示的数值有限,当出现超过这个限度的数值计算的时候,就是一个大数的计算问题,就需要用到数组了。
大致思想就是,把改进位的先保存,先不进位,保存到数组中,计算出"每一位“的值之后,在从"最低位"开始往高位进位。
之前写过c的代码:
- /*问题描述:当两个数比较大的时候就会出现溢出的现象。
- 解决方案:利用数组来保存结果。*/
- #include <stdio.h>
- #include <string.h>
- #define MAX 100
- unsigned arr1[MAX+10];
- unsigned arr2[MAX+10];
- unsigned result[MAX*2+10];
- char str1[MAX+10];
- char str2[MAX+10];
- int main()
- {
- int len1 = 0, len2 = 0, len3 = 0, i, j = 0;
- int flag = 0;
- //
- memset(arr1, 0, sizeof(arr1));
- memset(arr2, 0, sizeof(arr2));
- memset(result, 0, sizeof(result));
- //get函数
- gets(str1);
- gets(str2);
- //计算实际长度
- len1 = strlen(str1);
- //printf("%d\n", len1);
- len2 = strlen(str2);
- //把输入的数列反向转入数组,即最低位在数组的第一个位置[0]
- for(i = len1-1; i >= 0; i--)
- {
- arr1[j++] = str1[i] - '0';
- }
- j = 0;
- for(i = len2-1; i >= 0; i--)
- {
- arr2[j++] = str2[i] - '0';
- }
- //
- for(i = 0; i < len2; i++)
- {
- for(j = 0; j < len1; j++)
- {
- result[i+j] += arr1[i]*arr2[j];
- }
- }
- <SPAN style="COLOR: #ff0000">//进位</SPAN>
- for(i = 0; i < MAX*2; i++)
- {
- if(result[i] >= 10)
- {
- result[i+1] += result[i] / 10;//进十位数
- result[i] %= 10;//保留个位数
- }
- }
- //输出结果(注意输出的时候把数组最后的一连串的0全部去掉)
- for(i = MAX*2; i >= 0; i--)
- {
- if(flag)
- {
- printf("%d", result[i]);
- }
- else if(result[i])
- {
- printf("%d", result[i]);
- flag = 1;
- }
- }
- //
- if(!flag)
- printf("0");
- printf("\n");
- return 0;
- }