鱼C论坛

 找回密码
 立即注册
查看: 1534|回复: 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
  1. /*解题思路:
  2. 用next_permutation()函数列出数据a的全排列,通过跟数据b比较,当a大于b时,此时a的上一个排列就是最大的小于b的排列

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

  9. int main() {
  10.         char a[20];       
  11.         int b;       
  12.         cin >> a >> b;
  13.         int sum = 0;
  14.     int n=strlen(a);
  15.     for(int i = 0; i < n; i++) {
  16.             sum = sum * 10 + (a[i] - '0');
  17.         }
  18.        
  19.         if(sum < 1 || sum >= pow(10, 9) && b < 1 || b >= pow(10, 9)) {
  20.                 cout <<"输入错误!";
  21.                 exit(0);
  22.         }
  23.          
  24.         if(sum > b)
  25.                 cout << -1 <<endl;
  26.         else {
  27.                 int flag = 0;
  28.                 while(next_permutation(a, a+n)) {
  29.                     int last = sum;
  30.                     sum = 0;
  31.                     for(int i = 0; i < n; i++) {
  32.                             sum = sum * 10 + (a[i] - '0');
  33.                         }
  34.                         if(sum > b) {
  35.                                 cout << last << endl;
  36.                                 flag = 1;
  37.                                 break;
  38.                         }
  39.                 }
  40.                 if(flag == 0)               
  41.                         cout << sum << endl;
  42.         }
  43.    
  44.     return 0;
  45. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2020-12-23 11:06:32 From FishC Mobile | 显示全部楼层
救命大佬们
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 11:07:18 From FishC Mobile | 显示全部楼层
A是1234     B是3456
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 11:08:13 From FishC Mobile | 显示全部楼层
修改输入样例1
1234     3456
输出样例1
3421
输入样例2
10000      5
输出样例2
-1
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 15:52:18 From FishC Mobile | 显示全部楼层
救救小白吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 16:13:27 | 显示全部楼层
  1. // 给出两个整数A和B,可以重新排列A得到新的数字C(不能有前导0)。
  2. // 求在小于等于B的情况下,C的最大值是多少。如果不存在输出 - 1
  3. #include<stdio.h>
  4. int main()
  5. {
  6.         int i, j, k, n, A, B, C;
  7.         int a1, a2, a3, a4, max;
  8.         printf("输入两个整数:");
  9.         scanf("%d%d", &A, &B);
  10.         a1 = A / 1000;
  11.         a2 = (A - 1000 * a1) / 100;
  12.         a3 = (A - 1000 * a1 - 100 * a2) / 10;
  13.         a4 = A % 10;
  14.         max = A;
  15.         for (i = 1;i <= 1000;i *= 10)
  16.         {
  17.                 for (j = 1;j <= 1000;j *= 10)
  18.                 {
  19.                         for (k = 1;k <= 1000;k *= 10)
  20.                         {
  21.                                 for (n = 1;n <= 1000;n *= 10)
  22.                                 {
  23.                                         if (i != j && i != k && i != n && j != k && j != n && k != n)
  24.                                         {
  25.                                                 C = i * a1 + j * a2 + k * a3 + n * a4;
  26.                                                 if (C > max && C < B)
  27.                                                 {
  28.                                                         max = i * a1 + j * a2 + k * a3 + n * a4;
  29.                                                 }
  30.                                         }
  31.                                 }
  32.                         }
  33.                 }
  34.         }

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

  36. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  9. int main() {
  10.         char a[20];       
  11.         int b;       
  12.         cin >> a >> b;
  13.         int sum = 0;
  14.     int n=strlen(a);
  15.     for(int i = 0; i < n; i++) {
  16.             sum = sum * 10 + (a[i] - '0');
  17.         }
  18.        
  19.         if(sum < 1 || sum >= pow(10, 9) && b < 1 || b >= pow(10, 9)) {
  20.                 cout <<"输入错误!";
  21.                 exit(0);
  22.         }
  23.          
  24.         if(sum > b)
  25.                 cout << -1 <<endl;
  26.         else {
  27.                 int flag = 0;
  28.                 while(next_permutation(a, a+n)) {
  29.                     int last = sum;
  30.                     sum = 0;
  31.                     for(int i = 0; i < n; i++) {
  32.                             sum = sum * 10 + (a[i] - '0');
  33.                         }
  34.                         if(sum > b) {
  35.                                 cout << last << endl;
  36.                                 flag = 1;
  37.                                 break;
  38.                         }
  39.                 }
  40.                 if(flag == 0)               
  41.                         cout << sum << endl;
  42.         }
  43.    
  44.     return 0;
  45. }
复制代码
小甲鱼最新课程 -> https://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;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

大哥你这个样例2答案不对啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

如何不对了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

大神,你的循环思路是啥呀?原谅我没看懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你下次发帖子求助,请标明是C语言的,还是C++的好吗?浪费表情
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个不是我发的贴子。我只是逛逛,看到了你给别人的留言,不是很懂你的思路,只是问问别生气。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不好意思,没注意看,我去找一个你的帖子,在你的帖子解释
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

别生气,这个问题,我来发,你去回,还你一个最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-4 06:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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