牛客算法题:排列式 [全排列]

1002-排列式
链接:https://ac.nowcoder.com/acm/contest/18839/1002
来源:牛客网

题目描述

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

输入描述:

  无

输出描述:

每一行输出一个式子,式子中的等号前后空格、乘号(用字母x代表)前后空格
   较小的乘数写在前面 

示例1

输入

复制

输出

4396 = 28 x 157
5346 = 18 x 297
5346 = 27 x 198
5796 = 12 x 483
5796 = 42 x 138
6952 = 4 x 1738
7254 = 39 x 186
7632 = 48 x 159
7852 = 4 x 1963

涉及知识点:
[全排列]

需了解方法:
[使用next_permutation() { 头文件< algorithm > }函数,全排列1~9]
{这里有一篇写全排列的这个函数以及实现方法的文章 : 全排列及其回溯实现}

思路:
首先看样例输出发现乘积都是四位数;
然后需要知道的是四位数 = 一位数 * 四位数 或者 两位数 * 三位数
然后就是全排列就行,把所有顺序都走一遍,符合的就打印

代码(AC)

#include<iostream>
#include<algorithm>
using namespace std;

//判断情况是否成立,即因子相乘是否==预设乘积(res),符合即输出
void res_lr(int preres,int l,int r){
    
    
    if(preres == l * r){
    
    
        cout<<preres<<" = "<<l<<" x "<<r<<endl;
    }
}

void f1(int a[]){
    
    
    //乘积数
    int res;

    //l1 - 一位数因子 丨 r1 - 四位数因子
    int l1,r1;

    //l2 - 两位数因子 丨 r2 - 三位数因子
    int l2,r2;

    //循环不断做枚举即可,使用do-while不用担心会漏掉第一个顺序
    do{
    
    
        //4位数=1位数 x 4位数的情况
        res = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
        l1 = a[4];
        r1 = a[5] * 1000 + a[6] * 100 + a[7] * 10 + a[8];
        res_lr(res,l1,r1);
        //4位数=2位数 x 3位数的情况
        res = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
        l2 = a[4]*10+a[5];
        r2 = a[6] * 100 + a[7] * 10 + a[8];
        res_lr(res,l2,r2);

    }while(next_permutation(a,a+9));
}

int main(){
    
    
    //定义从1到9的数组,使用next_permutation(a,a+9)做全排列
    int t[9] = {
    
    1,2,3,4,5,6,7,8,9};
    f1(t);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/tom_jjJack/article/details/125381503