岛屿的缘分岛屿的缘分岛屿的缘分
题目
人和人的相识是一种缘分,其实人有幸到某地也是一种缘分。某风景优美的K小岛的缘分和其他景点的缘分来得不一般,K岛上有一个石碑刻上了两个很大很大的整数x和y,和一个正整数K,后面写道:“谁能准确的写出x和y的乘积中最右边的k位数(如果乘积不足K位则在左边用“0”补足K位),他就是和K小岛有缘分的人”,李先生到了K小岛,他马上叫他的秘书算一算,写出x和y的乘积中最右边的k位数,看看李先生和他的秘书是否和K小岛有缘分。现在也请你完成这个工作(注意: 如果乘积不足K位则在左边用“0”补足K位)。
输入
从文件b.in读入数据,文件中共有三行,第一行是一个位数不大于120的正整数x,第二行是一个位数不大于120的正整数y,第三行是一个正整数K(1=< K <=250)。
输出
结果输出到文件b.out中,只有一行,就是x和y的乘积中最右边的k位数。
输入样例
样例1:
b.in
30
60
3
样例2:
b.in
12
13
5
输出样例
样例1:
b.out
800
样例2:
b.out
00156
解题思路
这题我们就直接用高精乘即可.
程序如下
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[2000],b[2000],c[2000],la,lb,lc,x,k;
char a1[2000],b1[2000];
int main()
{
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
cin>>a1>>b1>>k;
la = strlen(a1);
lb = strlen(b1);
for(int i = 1; i <= la; ++i)
a[la - i + 1] = a1[i - 1] - '0';
for(int i = 1; i <= lb; ++i)
b[lb - i + 1] = b1[i - 1] - '0';
x = 0;
for(int i = 1; i <= la; ++i)
{
x = 0;
for(int j = 1; j <= lb; ++j)
{
c[i + j - 1] += a[i] * b[j] + x;
x = c[i + j - 1] / 10;
c[i + j - 1] = c[i + j - 1] % 10;
}
c[i + lb] = x;
}
lc = la + lb;
while(c[lc] == 0 && lc > 1) lc--;
for(int i = k; i >= 1; --i) cout<<c[i];
return 0;
}