C语言—超长正整数的乘法实现简洁版

【摘要】 今天给大家带来一道题目:

使用数组完成两个超长(位数长度小于 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
喜欢就支持一下吧
点赞0 分享