乘法问题
乘法问题
题目描述
蒜头君刚刚学会了乘法,老师给他布置了这样一道题:
也就是计算A乘以n个9组成的数,他不知道该怎么做,于是向你求助。
输入格式
两个用空格分开的整数An,1≤A<10200000,1≤n≤200000。
输出格式
一个整数表示答案。
样例输入
100 2
样例输出
9900
解法一
这题明摆着一个坑🕳,题目说“乘法问题”,但俩高精度做乘法,不超时都……
所以我们就要换个思路了,观察数据“999…999”,这个数很特别,可以转化成“100…000-1”,那么方法就来了:两个数组,一个存输入的数据,乘上1就是本身,所以不做其它操作,另一个数组存储输入数据末尾加上n个0的结果,就相当于乘了100…000。然后将两个数组做高精度减法(大减小),时间复杂度就会降低很多。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 string num; 5 int a1[1000005],a3[1000005],len1,n; 6 7 int main () 8 { 9 freopen("mul.in","r",stdin); 10 freopen("mul.out","w",stdout); 11 cin>>num; 12 len1=num.size(); 13 for (int i = 0; i < len1; i++) 14 { 15 a3[i] = num[len1 - 1 - i] - '0'; 16 } 17 cin>>n; 18 for(int i=0;i<n;i++) 19 { 20 a1[i]=0; 21 } 22 for(int i=n-1;i<len1+n;i++) 23 { 24 a1[i]=a3[i-n]; 25 } 26 27 28 len1+=n; 29 for (int i = 0; i < len1; i++) 30 { 31 a1[i] -= a3[i]; 32 } 33 for (int i = 0; i < len1; i++) 34 { 35 while (a1[i] < 0) 36 { 37 a1[i + 1]--; 38 a1[i] += 10; 39 } 40 } 41 while (len1 > 1 && a1[len1 - 1] == 0) 42 { 43 len1--; 44 } 45 46 for (int i = len1 - 1; i >= 0; i--) 47 { 48 cout << a1[i]; 49 } 50 cout << endl; 51 return 0; 52 }
有关高精度的劳烦小友自行百度惹╥﹏╥...
若阁下喜欢,赏一赞可否?
感谢您的阅读o(* ̄▽ ̄*)ブ