鱼C论坛

 找回密码
 立即注册
查看: 1366|回复: 18

[已解决]数字排列

[复制链接]
发表于 2020-12-23 10:58:55 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
给出两个整数A和B,可以重新排列A得到新的数字C(不能有前导0)。
求在小于等于B的情况下,C的最大值是多少。如果不存在输出-1
输入说明
第一行包含两个整数A和B。1<=A,B<10^9
输出说明
输出符合条件情况下C的最大值
输入样例1
12343456
输出样例1
3421
输入样例2
100005
输出样例2
-1
最佳答案
2020-12-23 16:31:48
/*解题思路:
用next_permutation()函数列出数据a的全排列,通过跟数据b比较,当a大于b时,此时a的上一个排列就是最大的小于b的排列

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

int main() {
        char a[20];        
        int b;        
        cin >> a >> b;
        int sum = 0;
    int n=strlen(a);
    for(int i = 0; i < n; i++) {
            sum = sum * 10 + (a[i] - '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[i] - '0');
                        }
                        if(sum > b) {
                                cout << last << endl;
                                flag = 1;
                                break;
                        }
                }
                if(flag == 0)                
                        cout << sum << endl;
        } 
    
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-23 11:06:31 | 显示全部楼层
      两个样例的输入分明就是一个数啊,难道还要把这个数切分成 A 和 B?如果说是,那么,问题来了,按什么原则切分?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 11:06:32 From FishC Mobile | 显示全部楼层
救命大佬们
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 11:07:18 From FishC Mobile | 显示全部楼层
A是1234     B是3456
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 11:08:13 From FishC Mobile | 显示全部楼层
修改输入样例1
1234     3456
输出样例1
3421
输入样例2
10000      5
输出样例2
-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 11:09:50 From FishC Mobile | 显示全部楼层
jackz007 发表于 2020-12-23 11:06
两个样例的输入分明就是一个数啊,难道还要把这个数切分成 A 和 B?如果说是,那么,问题来了,按什 ...

A是1234    B是3456
输入2
10000     5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 15:52:18 From FishC Mobile | 显示全部楼层
救救小白吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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);

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 16:31:48 | 显示全部楼层    本楼为最佳答案   
/*解题思路:
用next_permutation()函数列出数据a的全排列,通过跟数据b比较,当a大于b时,此时a的上一个排列就是最大的小于b的排列

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

int main() {
        char a[20];        
        int b;        
        cin >> a >> b;
        int sum = 0;
    int n=strlen(a);
    for(int i = 0; i < n; i++) {
            sum = sum * 10 + (a[i] - '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[i] - '0');
                        }
                        if(sum > b) {
                                cout << last << endl;
                                flag = 1;
                                break;
                        }
                }
                if(flag == 0)                
                        cout << sum << endl;
        } 
    
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 16:32:49 | 显示全部楼层
#include<bits/stdc++.h>
using namespace std;

int main() {
        char a[20];       
        int b;       
        cin >> a >> b;
        int sum = 0;
    int n=strlen(a);
    for(int i = 0; i < n; i++) {
            sum = sum * 10 + (a[i] - '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[i] - '0');
                        }
                        if(sum > b) {
                                cout << last << endl;
                                flag = 1;
                                break;
                        }
                }
                if(flag == 0)               
                        cout << sum << endl;
        }
   
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 16:45:31 From FishC Mobile | 显示全部楼层
风过无痕1989 发表于 2020-12-23 16:13

大哥你这个样例2答案不对啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 16:46:10 From FishC Mobile | 显示全部楼层
玛了个巴卡 发表于 2020-12-23 16:32
#include
using namespace std;


感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-24 10:01:15 | 显示全部楼层
727181660 发表于 2020-12-23 16:45
大哥你这个样例2答案不对啊

如何不对了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-24 10:03:37 | 显示全部楼层

大神,你的循环思路是啥呀?原谅我没看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-24 11:04:47 | 显示全部楼层
肚子饿了233 发表于 2020-12-24 10:03
大神,你的循环思路是啥呀?原谅我没看懂

你下次发帖子求助,请标明是C语言的,还是C++的好吗?浪费表情
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-24 13:21:00 From FishC Mobile | 显示全部楼层
风过无痕1989 发表于 2020-12-24 11:04
你下次发帖子求助,请标明是C语言的,还是C++的好吗?浪费表情

这个不是我发的贴子。我只是逛逛,看到了你给别人的留言,不是很懂你的思路,只是问问别生气。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不好意思,没注意看,我去找一个你的帖子,在你的帖子解释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-24 13:45:36 From FishC Mobile | 显示全部楼层
风过无痕1989 发表于 2020-12-24 13:33
不好意思,没注意看,我去找一个你的帖子,在你的帖子解释

不不不,大神,我之前发布的帖子在你的帮助下都弄清楚啦。昨天只是随便逛逛,偶然看到了你给别人的回复,有些地方不懂,所以想问问。诶,我的帖子好像都表明了C语言了呀~刚刚还以为你生气了,吓死我了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-24 15:48:39 | 显示全部楼层
风过无痕1989 发表于 2020-12-24 11:04
你下次发帖子求助,请标明是C语言的,还是C++的好吗?浪费表情

别生气,这个问题,我来发,你去回,还你一个最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 08:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表