【摘要】 今天给大家带来一道题目:
使用数组完成两个超长(位数长度小于 100)正整数的乘法。 从键盘输入两个正整数,输出乘法计算的结果。
题目看起来字很少,可这逻辑过程却不少。 我们知道,不管是 int 还是 long int型,一次性能储存的数据量都是有限的,因此在进行长整型的运算时,我们没法像过去计算短整数乘法一样直接利用内置函数去乘,那…究竟要怎么做呢?这里…
今天给大家带来一道题目:
使用数组完成两个超长(位数长度小于 100)正整数的乘法。
从键盘输入两个正整数,输出乘法计算的结果。
题目看起来字很少,可这逻辑过程却不少。
我们知道,不管是 int 还是 long int型,一次性能储存的数据量都是有限的,因此在进行长整型的运算时,我们没法像过去计算短整数乘法一样直接利用内置函数去乘,那…究竟要怎么做呢?这里我采用的方法是———小学生算法,实际上就是模拟手算的过程。
接下来上代码:
#include<stdio.h>
#include<string.h>
//进行字符与数字的转换
void CharTranslateToInt(int *pi,char *pc,int i){
pi[i] = (int)(pc[i]) - 48;
}
int main(void){ int i,j,k,temp,shi,ge,num1len,num2len;
int num1[100] = {0}, num2[100] = {0};
char str[100];
int sum[200] = {0}; printf("请输入乘数:");
scanf("%s",str);
num1len = strlen(str);
for(i = 0; i < num1len; i++){
CharTranslateToInt(num1,str,i);
} printf("请输入被乘数:");
scanf("%s",str);
num2len = strlen(str);
for(i = 0; i < num2len; i++){
CharTranslateToInt(num2,str,i);
}
//这里将每一次相乘的数加到对应位置上
for(i = num1len - 1; i >= 0; i--){
for(j = num2len - 1; j >= 0; j--){ temp = num1[i] * num2[j]; sum[num1len + num2len - 2 - i - j] += temp;
}
}
//接下来统一每一位满十往上一位进一
for(i = 0; i < 199; i++){
ge = sum[i] % 10;
shi = sum[i] / 10;
sum[i] = ge;
sum[i+1] += shi;
}
//从数组的末尾开始遍历,找到第一位非零数
for(i = 199;i >= 0; i--){
if(sum[i]){ k = i; break;
}
}
//接下来就是打印结果啦
printf("k = %d\n",k) ;
for(i = k; i >= 0; i--){
printf("%d",sum[i]);
}
return 0;
}
输出图如下~
那么问题来了,如何验算你的答案就是正确的呢?其实算一下最后一位的还有短整数的乘法就Ok啦
欢迎讨论~
文章来源: blog.csdn.net,作者:Mr_小郑,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/m0_55728779/article/details/116735181
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END