1.题目
给定两个正整数A和B,请你计算A * B的值。
输入格式
共两行,第一行包含整数A,第二行包含整数B。
输出格式
共一行,包含A * B的值。
数据范围
1≤A的长度≤100000,
0≤B≤10000
输入样例:
2
3
输出样例:
6
2.解题
两个数相乘,可以采用不同于平常计算乘法的方法
因为这里的两个数X,Y大小范围不一样,X是一个大数,而Y是在10000以内的小数,所以,将X倒置,然后每一位与Y相乘,得到的结果对10取模即为所求结果对应位的值,除以10为进位
java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static List<Integer> mul(int[] X, int Y) {
List<Integer> res = new ArrayList<>();
int t = 0;
for (int i = 0; i < X.length || t != 0; i++) {
if (i < X.length)
t += X[i] * Y;
res.add(t % 10);
t /= 10;
}
// 去掉前导0
int j = res.size() - 1;
while (res.size() > 1 && res.get(j) == 0) {
res.remove(j);
j--;
}
return res;
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String x = in.readLine();
String y = in.readLine();
int[] X = new int[x.length()];
for (int i = x.length() - 1, j = 0; i >= 0; i--, j++) {
X[j] = x.charAt(i) - '0';
}
int Y = Integer.parseInt(y);
List<Integer> res = mul(X, Y);
for (int j = res.size() - 1; j >= 0; j--) {
System.out.print(res.get(j));
}
in.close();
}
}
#include <iostream>
#include <vector>
using namespace std;
vector<int> mul(vector<int> &A, int b)
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || t; i ++ )
{
if (i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main()
{
string a;
int b;
cin >> a >> b;
vector<int> A;
for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
auto C = mul(A, b);
for (int i = C.size() - 1; i >= 0; i -- ) printf("%d", C[i]);
return 0;
}
3.相关知识
3.1 c++中的auto
在早期C/C++ 中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量
C++ 11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
例如:
auto a = 1;
auto b = 3.14;
注:使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
auto迭代:
对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围
int a[] = {1,2,3,4,5};
for(auto tmp : a){
cout << tmp << endl;
}