乘法问题

乘法问题

题目描述

蒜头君刚刚学会了乘法,老师给他布置了这样一道题:

也就是计算A乘以n个9组成的数,他不知道该怎么做,于是向你求助。

输入格式

两个用空格分开的整数An1A<102000001n200000。

输出格式

一个整数表示答案。


样例输入

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 }

  有关高精度的劳烦小友自行百度惹╥﹏╥...

 

posted @ 2020-08-15 11:58  DYXM  阅读(213)  评论(0编辑  收藏  举报