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

今天给大家带来一道题目:

使用数组完成两个超长(位数长度小于 100)正整数的乘法。
从键盘输入两个正整数,输出乘法计算的结果。

题目看起来字很少,可这逻辑过程却不少。
我们知道,不管是 int 还是 long int型,一次性能储存的数据量都是有限的,因此在进行长整型的运算时,我们没法像过去计算短整数乘法一样直接利用内置函数去乘,那…究竟要怎么做呢?这里我采用的方法是———小学生算法,实际上就是模拟手算的过程。

接下来上代码:

#include
#include

//进行字符与数字的转换
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;
} 


输出图如下~
C语言—超长正整数的乘法实现简洁版_第1张图片
那么问题来了,如何验算你的答案就是正确的呢?其实算一下最后一位的还有短整数的乘法就Ok啦

欢迎讨论~

你可能感兴趣的:(干货,题解,编程,算法,c语言,字符串)