百练2980:大整数乘法题解

2980:大整数乘法

总时间限制: 
1000ms 
内存限制: 
65536kB
描述

求两个不超过200位的非负整数的积。

输入
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
12345678900
98765432100
样例输出
1219326311126352690000
来源
程序设计实习2007
  • 查看 
  • 提交 
  • 统计 
  • 提示 
  • 提问
    • 代码:
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int N = 210;
    char num1[N],num2[N];
    int ans1[N * 2];
    char * strrev(char * s){
    	char * h = s,*t = s, ch;
    	while(*t++){}
    	t--; t--;
    	while(h < t){
    		ch = *h;
    		*h++ = *t;
    		*t-- = ch;
    	}
    	return s;
    }
    int main(){
    	scanf("%s",num1);
    	scanf("%s",num2);
    	memset(ans1,0,sizeof(ans1));
    	strrev(num1); strrev(num2);
    	int tmp;
    	int len1 = strlen(num1),len2 = strlen(num2);
    	for(int i = 0; i < len1; ++i){
    		for(int j = 0; j < len2; ++j){
    			ans1[i + j] += (num1[i] - '0') * (num2[j] - '0');
    		}
    	}
    	for(int i = 0; i < len1 + len2; i++){
    		if(ans1[i] >= 10){
    			ans1[i+1]+= ans1[i]/10;
    			ans1[i] %= 10;
    		}
    	}
    	int idx = len1 + len2;
    	while(ans1[idx] == 0 && idx >= 0) idx--;
    	if(idx < 0) putchar('0');
    	else {
    		for(int i = idx; i >= 0; i--){
    			printf("%d",ans1[i]);
    		}
    	}
    	putchar('\n');
    	return 0;
    }
    
    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/hongbudao/article/details/76768806
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞