题目描述
给定一个 nn 位整数 AA,各位从高到低依次为 a1,a2,…,ana1,a2,…,an。
给定一个 mm 位整数 BB,各位从高到低依次位 b1,b2,…,bmb1,b2,…,bm。
给定一种特殊乘法,不妨用 ⊗⊗ 来表示,我们规定 A⊗B=∑i=1n∑j=1mai×bjA⊗B=∑i=1n∑j=1mai×bj
例如,123⊗45=1×4+1×5+2×4+2×5+3×4+3×5123⊗45=1×4+1×5+2×4+2×5+3×4+3×5。
对于给定的 AA 和 BB,请你计算并输出 A⊗BA⊗B 的值。
输入格式
两个整数 AA 和 BB。
输出格式
一个整数,表示 A⊗BA⊗B 的值。
数据范围
1≤A,B≤1091≤A,B≤109
输入样例:
123 45
输出样例:
54
思路
刚开始看见这道题的时候,发现了一个问题,就是输入123时系统会认为是一百二十三,而不是123这三个数组,所以就需要将各个数字分离出来,自然而然想起之前那道倒序数的思路,写个子函数,把数的各个位上的数字分离出来,然后再逐个相乘。但是这样太麻烦了,所以借鉴了答案,答案用的是char型数组,这样就避免了前面提到的问题,减少了很多工作量。然后答案有一处是while(scanf("%s""%s",a,b)!=EOF),这句代码的意思是输入a和b直到输入空格,关于EOF可以去参考:EOF的意义及用法(while(scanf("%d",&n) != EOF))-优快云博客,很全面。关于这个三重循环的执行顺序是:例如a为123,b为45,那么先输入123和45,再执行下面的二重循环。所以这道题收获最大的思路是,善于运用char型数组。此外还有个小问题,最开始写num+=a[i]*b[j]是错的,改成num += (a[i] - '0') * (b[j] - '0')后就是对的,原因在于:a[i]它的类型是char,也就是ASCII码的数字,如果要转换到int的数字,需要减去'0'。运用了ASCII码的差值实现char到int的转换,举个例子:
char a = '1';
int b = a - '0'; // b的值为1
代码如下:
#include <iostream>
#include <stdio.h>//用scanf的头文件
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
int main() {
char a[20], b[20];
int num;
while (scanf("%s""%s", a, b) != EOF) {//这个写法要记住
num = 0;
for (int i = 0;a[i] != '\0';i++) {
for (int j = 0;b[j] != '\0';j++) {
num += (a[i] - '0') * (b[j] - '0');//最初写的是 num+=a[i]*b[j]就是错的
}
}
}
printf("%d\n", num);
return 0;
}