数字排列
给出两个整数A和B,可以重新排列A得到新的数字C(不能有前导0)。求在小于等于B的情况下,C的最大值是多少。如果不存在输出-1
输入说明
第一行包含两个整数A和B。1<=A,B<10^9
输出说明
输出符合条件情况下C的最大值
输入样例1
12343456
输出样例1
3421
输入样例2
100005
输出样例2
-1 两个样例的输入分明就是一个数啊,难道还要把这个数切分成 A 和 B?如果说是,那么,问题来了,按什么原则切分? 救命大佬们 A是1234 B是3456 修改输入样例1
1234 3456
输出样例1
3421
输入样例2
10000 5
输出样例2
-1 jackz007 发表于 2020-12-23 11:06
两个样例的输入分明就是一个数啊,难道还要把这个数切分成 A 和 B?如果说是,那么,问题来了,按什 ...
A是1234 B是3456
输入2
10000 5 救救小白吧 // 给出两个整数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);
} /*解题思路:
用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;
}
#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;
}
风过无痕1989 发表于 2020-12-23 16:13
大哥你这个样例2答案不对啊 玛了个巴卡 发表于 2020-12-23 16:32
#include
using namespace std;
感谢 727181660 发表于 2020-12-23 16:45
大哥你这个样例2答案不对啊
如何不对了?{:5_94:} 风过无痕1989 发表于 2020-12-23 16:13
大神,你的循环思路是啥呀?原谅我没看懂{:5_100:} 肚子饿了233 发表于 2020-12-24 10:03
大神,你的循环思路是啥呀?原谅我没看懂
你下次发帖子求助,请标明是C语言的,还是C++的好吗?浪费表情 风过无痕1989 发表于 2020-12-24 11:04
你下次发帖子求助,请标明是C语言的,还是C++的好吗?浪费表情
这个不是我发的贴子。我只是逛逛,看到了你给别人的留言,不是很懂你的思路,只是问问别生气。 肚子饿了233 发表于 2020-12-24 13:21
这个不是我发的贴子。我只是逛逛,看到了你给别人的留言,不是很懂你的思路,只是问问别生气。
不好意思,没注意看,我去找一个你的帖子,在你的帖子解释 风过无痕1989 发表于 2020-12-24 13:33
不好意思,没注意看,我去找一个你的帖子,在你的帖子解释
不不不,大神,我之前发布的帖子在你的帮助下都弄清楚啦。昨天只是随便逛逛,偶然看到了你给别人的回复,有些地方不懂,所以想问问。诶,我的帖子好像都表明了C语言了呀~刚刚还以为你生气了,吓死我了。 风过无痕1989 发表于 2020-12-24 11:04
你下次发帖子求助,请标明是C语言的,还是C++的好吗?浪费表情
别生气,这个问题,我来发,你去回,还你一个最佳答案
页:
[1]