特殊乘法。

题目描述

给定一个 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值