【7.31】C++编写7254是一个不寻常的数,可以表示为7254 = 39 x 186,这个式子中1~9每个数字正好出现一次

题目题干

7254是一个不寻常的数,因为它可以表示为7254 = 39 x 186,这个式子中1~9每个数字正好出现一次,输出所有这样的不同的式子(乘数交换被认为是相同的式子)。结果小的先输出;结果相同的,较小的乘数较小的先输出。

解题思路

拿到题目的时候,我们其实可以意识到一个很明显的事实

1.这个式子只能在1~9之中进行选取,也就是说——

结果 = 数one x 数two
结果位数 + 数one位数 + 数two位数 = 9位
我们可以发现当结果为五位数时,数one和数two相乘不管怎么样也达不成。因为就算极端情况99 x 99也是小于100 x 100。也就是五位数。
同理当结果为3位数时,数one&two不管怎么样相乘都不会这么小。
所以结果只能为4位数,此时有两种情况一种是个位数x4位数,一种是3位数x2位数。

当我们意识到这点时我们就可以锁定,数值大概得位置,我们就可以用可以将他们比作成一个数组,给变量赋值,并且通过循环判断语句,来输出我们的结果。

代码部分

#include<iostream>
#include<algorithm>									//我们的全排列函数所在的库,在这里调用
using namespace std;
void compcout(int res,int multione,int multitwo)	//判断等式是否成立,输出结果的函数
{
    if (res==multione*multitwo)
    {
        cout<<res<<" = "<<multione<<" x "<<multitwo<<endl;
    }
}
void identity(int num[])
{
    while (next_permutation(num,num+9))						//全排列函数
    {
        int res;
        int x1,y1;									//设置两个变量是因为,相乘的两数位数不同
        int x2,y2;
        res=num[0]*1000+num[1]*100+num[2]*10+num[3];
        x1=num[4];
        y1=num[5]*1000+num[6]*100+num[7]*10+num[8];
        compcout(res,x1,y1);
        res=num[0]*1000+num[1]*100+num[2]*10+num[3];	
        x2=num[4]*10+num[5];
        y2=num[6]*100+num[7]*10+num[8];
        compcout(res,x2,y2);
    }
}
int main()
{
    int num[9]={1,2,3,4,5,6,7,8,9};				//题目中1-9之中进行取值
    identity(num);
    return 0;
}

所得结果

运行结果:

其中我们要注意输出时的空格哟

心得

1.需要自己仔细审题,不要将思维局限,获得所需条件。
2.多调用使用现成的库函数,可以提高我们的效率。
ps:因为是全排列的函数,我们其实可以发现他其实是按照字典排列,也就是由小及大,并且一一列举。并且全排列,一般是作用于数组,是从后寻找的。
3.在输出时,记得格式要正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值