高精度乘法
今天算是假期集训的第一天,第一次一整天只学信息,刺激啊~~~虽然很累,但是还是要整理一下嘛。
高精度
之前学过高精度加法,所以不多说,直接出代码:
#include<iostream> #include<cstring> using namespace std; int main(){ char a[205],b[205]; int a1[205],m,c[205],b1[205],l2,l1,l,k=1; scanf("%s",a); scanf("%s",b); l1=strlen(a); l2=strlen(b); memset(c,0,sizeof(c)); memset(a1,0,sizeof(a1)); memset(b1,0,sizeof(b1)); for(int i=0;i<l1;i++) { a1[l1-i-1]=a[i]-48; } for(int i=0;i<l2;i++) { b1[l2-i-1]=b[i]-48; } m=0; for(int i=0;i<max(l1,l2)+1;i++) { c[i]=a1[i]+b1[i]+m; m=c[i]/10; c[i]=c[i]%10; } l=max(l1,l2); for(int i=l;i>=0;i--) if(c[i]==0)l--; else break; for(int i=l;i>=0;i--) { cout<<c[i]; k=0; } if(k==1) cout<<"0"; return 0; }
今天新学了一个高精乘法,总体思路是一样的,无非分为3个模块,分别是:读入数字,进行运算,输出得数。
第一点,读入数字。和加法一样,读入一个字符串,再一一倒着转换为整形数组。(倒着存一是为了对齐末尾,二是为了方便)
第二点,进行运算。核心代码段:
for(int i = 1;i <= l1;i++)
{
x = 0;
for(int j = 1;j <= l2;j++)
{
c[i + j - 1] = x + c[i + j - 1] + a[i] * b[j];
x = c[i + j - 1] / 10;
c[i + j - 1] %= 10;
}
c[i + l1] = x;
}
这个是整个代码的核心,主要难点是进位,进位解决了,整个程序就没什么难度了。(不要忘了 c[i + l1] = x; 进行最后一位的进位)
最后输出得数,除了删除前导零,没什么难度。
代码如下:
#include<cstdio> #include<iostream> #include<cstring> using namespace std; char a1[100],b1[100]; int a[100] = {0},b[100] = {0},c[205] = {0}; int main() { int l1,l2,l,x; gets(a1); gets(b1); l1 = strlen(a1); l2 = strlen(b1); for(int i = 0;i < l1; i++) { a[l1 - i] = a1[i] - '0'; } for(int i = 0;i < l2; i++) { b[l2 - i] = b1[i] - '0'; } for(int i = 1;i <= l1;i++) { x = 0; for(int j = 1;j <= l2;j++) { c[i + j - 1] = x + c[i + j - 1] + a[i] * b[j]; x = c[i + j - 1] / 10; c[i + j - 1] %= 10; } c[i + l1] = x; } l = l1 + l2; for(int i = l;i > 1; i--) { if(c[i] != 0) break; else l--; } for(int i = l;i >= 1;i--) { cout<<c[i]; } return 0; }
只想找一个不会伤害我的人