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

该问题涉及寻找1到9的数字组合,使得乘积等于一个四位数,且每个数字恰好出现一次。通过全排列方法解决,利用C++编程实现,通过next_permutation函数生成所有可能的数对并检查它们的乘积。程序输出满足条件的所有不同乘法表达式,按特定顺序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目题干

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.在输出时,记得格式要正确。

在Java中,要合并两个有序列表,可以创建一个新的列表,然后遍历每个源列表,依次添加元素到新列表中。这里我们可以使用ArrayList作为容器,因为它支持动态扩容。以下是`mergeSortedLists`方法的实现: ```java import java.util.ArrayList; import java.util.List; public class ListMerger { public static <T extends Comparable<T>> List<T> mergeSortedLists(List<T> list1, List<T> list2) { if (list1 == null || list1.isEmpty()) return list2; if (list2 == null || list2.isEmpty()) return list1; ArrayList<T> mergedList = new ArrayList<>(list1); int i = 0, j = 0; while (i < list1.size() && j < list2.size()) { if (list1.get(i).compareTo(list2.get(j)) <= 0) { mergedList.add(list1.get(i)); i++; } else { mergedList.add(list2.get(j)); j++; } } // 如果list1还有剩余元素没加,直接追加 while (i < list1.size()) { mergedList.add(list1.get(i)); i++; } // 如果list2还有剩余元素没加,也追加 while (j < list2.size()) { mergedList.add(list2.get(j)); j++; } return mergedList; } } ``` 为了测试这个方法,你可以创建一个简单的主程序: ```java import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> list1 = Arrays.asList(1, 3, 5, 7); List<Integer> list2 = Arrays.asList(2, 4, 6, 8); List<Integer> mergedList = ListMerger.mergeSortedLists(list1, list2); System.out.println("Merged sorted list: " + mergedList); } } ``` 当你运行这段代码时,它会输出合并后的有序列表 `[1, 2, 3, 4, 5, 6, 7, 8]`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值