高精度乘法
作者:互联网
输入两个数求出两数之积
思路:
模拟:1.先通过字符串读入数据然后,倒序导入整型数组。
2.然后开始模拟即可,即通过两重循环枚举,然后错位相加,最后进位得到结果。
(1)开始模拟:两重循环,同时错位相加进入c数组
1 for(int i = 1; i <= lena; i++) 2 { 3 for(int j = 1; j <= lenb; j++) 4 { 5 c[i+j-1] += a[i]*b[j]; 6 } 7 }
c[i+j-1]用的非常巧妙,可以理解为每一位每一位的正常相乘,而i就是错位,因为每乘外循环的一个新数就要错位一次,之后就得到一堆没有进位的答案,我们只需要挨个进位即可。
1 for(int i = 1; i < lena+lenb; i++) 2 { 3 if(c[i] > 9) 4 { 5 c[i+1] += c[i]/10; 6 c[i] %= 10; 7 } 8 }
总Code:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 6 using namespace std; 7 char a1[10001], b1[10001]; 8 int a[10001], b[10001], c[10001]; 9 int main() 10 { 11 cin >> a1 >> b1; 12 13 int lena = strlen(a1); 14 int lenb = strlen(b1); 15 16 for(int i = 1; i <= lena; i++) 17 { 18 a[i] = a1[lena - i]-'0'; 19 } 20 for(int i = 1; i <= lenb; i++) 21 { 22 b[i] = b1[lenb - i]-'0'; 23 } 24 25 for(int i = 1; i <= lena; i++) 26 { 27 for(int j = 1; j <= lenb; j++) 28 { 29 c[i+j-1] += a[i]*b[j]; 30 } 31 } 32 for(int i = 1; i < lena+lenb; i++) 33 { 34 if(c[i] > 9) 35 { 36 c[i+1] += c[i]/10; 37 c[i] %= 10; 38 } 39 } 40 int len = lena+lenb; 41 while(c[len] == 0 && len > 1) 42 { 43 len--; 44 } 45 for(int i = len; i >= 1; i--) 46 { 47 cout << c[i]; 48 } 49 system("pause"); 50 return 0; 51 }
标签:10,错位,10001,高精度,int,len,include,乘法 来源: https://www.cnblogs.com/ZhengLijie/p/12884789.html