A*B 问题
成绩 | 10 | 开启时间 | 2018年02月5日 星期一 17:25 |
折扣 | 0.8 | 折扣时间 | 2018年12月5日 星期三 17:25 |
允许迟交 | 否 | 关闭时间 | 2018年12月5日 星期三 17:25 |
问题描述
计算最多20010位十进制正整数A和B的乘积A*B。
输入样例
1259
8
输出样例
10072
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
Java版大整数类
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String str1=sc.nextLine();
String str2=sc.nextLine();
BigInteger x1=new BigInteger(str1);
BigInteger x2=new BigInteger(str2);
System.out.println(x1.multiply(x2));
}
}
C++:O(n^2)
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
int A[40025];
int B[40025];
int ans[40025];//ans[0]用来存储答案的位数
string s;
int main()
{
int i = 1; int j = 1;
string str1;
string str2;
cin >> str1; cin >> str2;
int lenA = str1.length();
int lenB = str2.length();
for (; i <= lenA; i++)
A[i] = str1[lenA - i]-'0';
for (; j <= lenB; j++)
B[j] = str2[lenB - j]-'0';
ans[0] = 1;
for (int i = 1; i <= lenA; i++)
{
for ( j = 1; j <= lenB; j++)
{
ans[i + j-1] += A[i] * B[j];
}
}
for (int i = 1; i <= lenA+lenB; i++)
{
ans[i + 1] += ans[i] / 10; ans[i] %= 10;
}
if (ans[lenA + lenB]) ans[0] = lenA + lenB;
else
ans[0] = lenA + lenB - 1;
for (int k = ans[0]; k >= 1; k--)
printf("%d", ans[k]);
printf("\n");
return 0;
}