题目描述
【问题描述】
若两个正整数的乘积,等于两正整数各自逆序后的乘积,则称其为逆序乘积式。编写程序读入两个正整数,然后判断这两个正整数能否构成逆序乘积式。假设两个正整数的乘积不会超过int数据类型的表示范围。
【输入形式】
从控制台输入以一个空格分隔的两个正整数。
【输出形式】
若两个正整数能够构成逆序乘积式,则输出两个正整数及其逆序的乘积形式,并且中间用一个等号相连;若不能构成逆序乘积式,则输出两个正整数及其逆序的乘积形式,并且中间用一个不等号相连。
注意:输出的字符之间没有空格分隔。若逆序后最高位为0,则为0的最高位不输出。
【样例输入1】
12 693
【样例输出1】
12*693=21*396
【样例1说明】
输入的两个正整数为12和693,其乘积为8316。将这两个正整数逆序后分别为21和396,其乘积为8316。两者乘积相等,所以输出12*693=21*396。
【样例输入2】
185 1300
【样例输出2】
185*1300!=581*31
【样例2说明】
输入的两个正整数为185和1300,其乘积为240500。将这两个正整数逆序后分别为581和31,其乘积为18011。两者乘积不相等,所以输出185*1300!=581*31。
题解
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int numa[5] = { 0 };
int numb[5] = { 0 };
int num_digits_a = static_cast<int>(log10(a) + 1);
int num_digits_b = static_cast<int>(log10(b) + 1);
int tempa = a;
int tempb = b;
// 提取每一位数字
for (int i = 0; i < num_digits_a; ++i) {
numa[num_digits_a - 1 - i] = tempa % 10;
tempa /= 10;
}
for (int i = 0; i < num_digits_b; ++i) {
numb[num_digits_b - 1 - i] = tempb % 10;
tempb /= 10;
}
int turn_a = 0;
int turn_b = 0;
// 反转数字
for (int i = num_digits_a-1; i >= 0 ; i--) {
turn_a = turn_a * 10 + numa[i];
}
for (int i = num_digits_b - 1; i >= 0; i--) {
turn_b = turn_b * 10 + numb[i];
}
if (turn_a * turn_b == a * b) {
cout << a << "*" << b << "=" << turn_a << "*" << turn_b << endl;
}
else {
cout << a << "*" << b << "!=" << turn_a << "*" << turn_b << endl;
}
return 0;
}
解释
(一)数字 位数的计算
int num_digits_a = static_cast<int>(log10(a) + 1);
int num_digits_b = static_cast<int>(log10(b) + 1);
使用int 型强转 +log10();
比如对于12345这个 五位数。
log10(12345) = 4点几。给他+1 就正好 五点几。
int强转之后 正好是5。
(二)提取每一位数字
int tempa = a;
int tempb = b;
// 提取每一位数字
for (int i = 0; i < num_digits_a; ++i) {
numa[num_digits_a - 1 - i] = tempa % 10;
tempa /= 10;
}
for (int i = 0; i < num_digits_b; ++i) {
numb[num_digits_b - 1 - i] = tempb % 10;
tempb /= 10;
}
1.首先要声明temp这个临时变量,来替代a,b。防止在之后的处理中改变原来的变量。
2.使用 for循环,先给 i 赋 0 ,i 小于 它的最高位数 。数组赋值时采用 [最大位数 - 1 - i],而 i 是从0开始的,所以顺序从大到小。比如,5位数,就是 [4][3][2][1][0]。
3.tempa % 10 ,再来看这个。具体比如,26321,那么tempa % 10 = 1,也就是个位数。
就是从个位数起,把个位数赋给[4], 十位数赋给[3],以此类推。
那么最后的结果就是,26321->[0][1][2][3][4]。
4.tempa /= 10;就是每次/10,比如26321 -> 2632.1。等到下次的时候%10的时候就得2。刚刚好。
(三)反转数字
int turn_a = 0;
int turn_b = 0;
// 反转数字
for (int i = num_digits_a-1; i >= 0 ; i--) {
turn_a = turn_a * 10 + numa[i];
}
for (int i = num_digits_b - 1; i >= 0; i--) {
turn_b = turn_b * 10 + numb[i];
}
1.先声明变量接收反转后的数字。
2.for循环中,i 从大到小,跟上面的距离一样五位数的话,i 变化历程就是 4 3 2 1 0。
分析循环:第一次:turn_a = 0*10 + numa[4]. 即 turn_a = 0*10 + 1 = 1.
第二次:turn_a = 1*10 + numa[3].即 turn_a = 1*10 + 2 = 12.
第三次:turn_a = 12*10 + numa[2].即turn_a = 12*10 + 3 = 123.
第四次:turn_a = 123*10 + numa[1].即turn_a = 123*10 + 6 = 1236.
第五次:turn_a = 1236*10 + numa[0].即turn_a = 1236*10 + 2= 12362.
完成!
这样从 低位的位数 开始不断*10,越乘越多,到最后 原先的个位数*10000,十位数*1000.以此类推。完成 了反转。
标签:digits,10,乘积,int,C++,turn,num,逆序 From: https://blog.csdn.net/2403_87830841/article/details/143484544