首页 > 编程语言 >C++ 逆序乘积式

C++ 逆序乘积式

时间:2024-11-04 22:44:32浏览次数:3  
标签:digits 10 乘积 int C++ turn num 逆序

 题目描述

【问题描述】

若两个正整数的乘积,等于两正整数各自逆序后的乘积,则称其为逆序乘积式。编写程序读入两个正整数,然后判断这两个正整数能否构成逆序乘积式。假设两个正整数的乘积不会超过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

相关文章

  • HarmonyOS 开发实践——基于HAR的跨模块C++头文件引用
    ......
  • RBE104TC C/C++ Programming
    RBE104TC C/C++ Programming Language Assignment 2ContributiontotheOverallMarks70%IssueDate SubmissionDeadline3rdNovember2024AssignmentOverview: This assignment is geared towards assessing fundamental co......
  • C++ 中类的三大特性是什么?
    封装:封装是将数据和操作数据的方法捆绑在一起,形成一个类。通过封装,类的内部实现细节被隐藏起来,只对外提供公共的接口。这样做有以下几个好处:数据安全性:封装可以防止外部代码直接访问和修改类的内部数据,只能通过类提供的方法进行操作。这样可以保证数据的安全性和完整性,避免因......
  • 算法|牛客网华为机试31-40C++
    牛客网华为机试上篇:算法|牛客网华为机试21-30C++文章目录HJ31单词倒排HJ32密码截取HJ33整数与IP地址间的转换HJ34图片整理HJ35蛇形矩阵HJ36字符串加密HJ37统计每个月兔子的总数HJ38求小球落地5次后所经历的路程和第5次反弹的高度HJ39判断两个IP是否属于同一子......
  • C++程序设计笔记:终止程序函数abort与exit 20241104
    在C++中,abort()和exit()都是用来终止程序执行的函数,但它们的用途和行为有所不同。abort()函数abort()函数是定义在<cstdlib>或<stdlib.h>头文件中的,它用于异常终止程序。当调用abort()时,程序会立即停止执行,并且会进行堆栈展开(unwind),以调用所有已注册的析构函数和清理......
  • C/C++ stackful 有栈协同程式的一些缺点。
    在阅读本文之前,可以先查阅本人以下其它文章:C++20标准协同程序(协程)基于编译器展开的stackless协程。_协同编译具体-CSDN博客C/C++如何正确的切换协同程序?(基于协程的并行架构)_c++怎么切换运行程序-CSDN博客 关于Go协同程序(Coroutines协程)、Go汇编及一些注意事项。_go......
  • C++语言的起源。哪些程序是C++编写的?为什么早期VC++对ANSI C89之后的标准支持不好?
    C++语言的起源C++最初被称为带类的C,兼容C的语法,此既是C++得以流行的前提,也是C++某些语法被捆绑的根源。C++的++来源于C语言的递增运算符,代表增加,意义为扩展。BjarneStroustrup博士在做博士论文写代码的时候,遇到一些困难,发现Simu......
  • 【C++】reference to ‘prev‘ is ambiguous:std 命名空间冲突引发的编译错误
    问题描述C++代码编译错误:usingnamespacestd;usingll=longlong;constintN=1e6+7;llprev[N];原因分析在C++的标准库中,std命名空间包含一个名为std::prev的函数,该函数用于获取容器中的前一个迭代器。在上述代码中,通过usingnamespacestd;语句,所......
  • 【C&C++】C4996 ‘fopen‘: This function or variable may be unsafe. Consider usin
    问题描述在使用VisualStudio编译运行C/C++程序时,编译器返回警告信息。FILE*file;file=fopen("file.csv","w+");编译器返回的警告信息如下:C4996 'fopen':Thisfunctionorvariablemaybeunsafe.Considerusingfopen_sinstead.Todisabledeprecation,......
  • 【C++练习】判断成绩是否恰好有一门不及格
    题目:判断成绩是否恰好有一门不及格描述:编写一个程序,输入学生的语文和数学成绩,判断该学生是否恰好有一门课不及格(不及格的标准是成绩低于60分)。如果恰好有一门课不及格,则输出1;如果没有课程不及格或者两门课都不及格,则输出0。输入:输入两个整数,分别表示语文成绩和数学成绩。......