727181660 发表于 2020-12-23 10:58:55

数字排列

给出两个整数A和B,可以重新排列A得到新的数字C(不能有前导0)。
求在小于等于B的情况下,C的最大值是多少。如果不存在输出-1
输入说明
第一行包含两个整数A和B。1<=A,B<10^9
输出说明
输出符合条件情况下C的最大值
输入样例1
12343456
输出样例1
3421
输入样例2
100005
输出样例2
-1

jackz007 发表于 2020-12-23 11:06:31

      两个样例的输入分明就是一个数啊,难道还要把这个数切分成 A 和 B?如果说是,那么,问题来了,按什么原则切分?

727181660 发表于 2020-12-23 11:06:32

救命大佬们

727181660 发表于 2020-12-23 11:07:18

A是1234   B是3456

727181660 发表于 2020-12-23 11:08:13

修改输入样例1
1234   3456
输出样例1
3421
输入样例2
10000      5
输出样例2
-1

727181660 发表于 2020-12-23 11:09:50

jackz007 发表于 2020-12-23 11:06
两个样例的输入分明就是一个数啊,难道还要把这个数切分成 A 和 B?如果说是,那么,问题来了,按什 ...

A是1234    B是3456
输入2
10000   5

727181660 发表于 2020-12-23 15:52:18

救救小白吧

风过无痕1989 发表于 2020-12-23 16:13:27

// 给出两个整数A和B,可以重新排列A得到新的数字C(不能有前导0)。
// 求在小于等于B的情况下,C的最大值是多少。如果不存在输出 - 1
#include<stdio.h>
int main()
{
        int i, j, k, n, A, B, C;
        int a1, a2, a3, a4, max;
        printf("输入两个整数:");
        scanf("%d%d", &A, &B);
        a1 = A / 1000;
        a2 = (A - 1000 * a1) / 100;
        a3 = (A - 1000 * a1 - 100 * a2) / 10;
        a4 = A % 10;
        max = A;
        for (i = 1;i <= 1000;i *= 10)
        {
                for (j = 1;j <= 1000;j *= 10)
                {
                        for (k = 1;k <= 1000;k *= 10)
                        {
                                for (n = 1;n <= 1000;n *= 10)
                                {
                                        if (i != j && i != k && i != n && j != k && j != n && k != n)
                                        {
                                                C = i * a1 + j * a2 + k * a3 + n * a4;
                                                if (C > max && C < B)
                                                {
                                                        max = i * a1 + j * a2 + k * a3 + n * a4;
                                                }
                                        }
                                }
                        }
                }
        }

        printf("%d\n", max);

}

玛了个巴卡 发表于 2020-12-23 16:31:48

/*解题思路:
用next_permutation()函数列出数据a的全排列,通过跟数据b比较,当a大于b时,此时a的上一个排列就是最大的小于b的排列

具体解法:
因为next_permutation()方法的参数必须是数组,所以定义char a来存放第一个数值,再通过遍历并计算数组a,把a的值赋值给sum;用while循环,直到next_permutation()全排列结束;定义last变量,使之与sum错开一个排列;标志flag,如果全排列中有比数值b大的,满足条件,打印并跳出循环,如果没有,通过flag标志的1将最大的排列sum打印
*/
//代码实现:
#include<bits/stdc++.h>
using namespace std;

int main() {
        char a;       
        int b;       
        cin >> a >> b;
        int sum = 0;
    int n=strlen(a);
    for(int i = 0; i < n; i++) {
            sum = sum * 10 + (a - '0');
        }
       
        if(sum < 1 || sum >= pow(10, 9) && b < 1 || b >= pow(10, 9)) {
                cout <<"输入错误!";
                exit(0);
        }
       
        if(sum > b)
                cout << -1 <<endl;
        else {
                int flag = 0;
                while(next_permutation(a, a+n)) {
                    int last = sum;
                    sum = 0;
                    for(int i = 0; i < n; i++) {
                            sum = sum * 10 + (a - '0');
                        }
                        if(sum > b) {
                                cout << last << endl;
                                flag = 1;
                                break;
                        }
                }
                if(flag == 0)               
                        cout << sum << endl;
        }
   
    return 0;
}

玛了个巴卡 发表于 2020-12-23 16:32:49

#include<bits/stdc++.h>
using namespace std;

int main() {
        char a;       
        int b;       
        cin >> a >> b;
        int sum = 0;
    int n=strlen(a);
    for(int i = 0; i < n; i++) {
            sum = sum * 10 + (a - '0');
        }
       
        if(sum < 1 || sum >= pow(10, 9) && b < 1 || b >= pow(10, 9)) {
                cout <<"输入错误!";
                exit(0);
        }
       
        if(sum > b)
                cout << -1 <<endl;
        else {
                int flag = 0;
                while(next_permutation(a, a+n)) {
                    int last = sum;
                    sum = 0;
                    for(int i = 0; i < n; i++) {
                            sum = sum * 10 + (a - '0');
                        }
                        if(sum > b) {
                                cout << last << endl;
                                flag = 1;
                                break;
                        }
                }
                if(flag == 0)               
                        cout << sum << endl;
        }
   
    return 0;
}

727181660 发表于 2020-12-23 16:45:31

风过无痕1989 发表于 2020-12-23 16:13


大哥你这个样例2答案不对啊

727181660 发表于 2020-12-23 16:46:10

玛了个巴卡 发表于 2020-12-23 16:32
#include
using namespace std;



感谢

肚子饿了233 发表于 2020-12-24 10:01:15

727181660 发表于 2020-12-23 16:45
大哥你这个样例2答案不对啊

如何不对了?{:5_94:}

肚子饿了233 发表于 2020-12-24 10:03:37

风过无痕1989 发表于 2020-12-23 16:13


大神,你的循环思路是啥呀?原谅我没看懂{:5_100:}

风过无痕1989 发表于 2020-12-24 11:04:47

肚子饿了233 发表于 2020-12-24 10:03
大神,你的循环思路是啥呀?原谅我没看懂

你下次发帖子求助,请标明是C语言的,还是C++的好吗?浪费表情

肚子饿了233 发表于 2020-12-24 13:21:00

风过无痕1989 发表于 2020-12-24 11:04
你下次发帖子求助,请标明是C语言的,还是C++的好吗?浪费表情

这个不是我发的贴子。我只是逛逛,看到了你给别人的留言,不是很懂你的思路,只是问问别生气。

风过无痕1989 发表于 2020-12-24 13:33:04

肚子饿了233 发表于 2020-12-24 13:21
这个不是我发的贴子。我只是逛逛,看到了你给别人的留言,不是很懂你的思路,只是问问别生气。

不好意思,没注意看,我去找一个你的帖子,在你的帖子解释

肚子饿了233 发表于 2020-12-24 13:45:36

风过无痕1989 发表于 2020-12-24 13:33
不好意思,没注意看,我去找一个你的帖子,在你的帖子解释

不不不,大神,我之前发布的帖子在你的帮助下都弄清楚啦。昨天只是随便逛逛,偶然看到了你给别人的回复,有些地方不懂,所以想问问。诶,我的帖子好像都表明了C语言了呀~刚刚还以为你生气了,吓死我了。

乐乐学编程 发表于 2020-12-24 15:48:39

风过无痕1989 发表于 2020-12-24 11:04
你下次发帖子求助,请标明是C语言的,还是C++的好吗?浪费表情

别生气,这个问题,我来发,你去回,还你一个最佳答案
页: [1]
查看完整版本: 数字排列