获取一个自然数的重新排列后,下一个比它大的自然数

给定任意一个自然数,获取它重新排列后,下一个比它大的自然数,要求时间复杂度O(n)。

例如:

        给定1233,它的下一个是1323;

        给定1323,它的下一个是1332;

        给定9876,它的下一个不存在;

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
bool cmp(int a, int b) {
    return a < b;
}
void solve(int num) {
	int a[1000], len = 0, min = 1000000, temp = num;
	do{
		a[len++] = num % 10;
		num /= 10;
	} while(num != 0);
	sort(a, a + len,cmp);
	do {
		int sum = 0, s = 1;
		for(int i=0; i < len; i++) {
		 	sum += a[i] * s;
		 	s *= 10;
		}
		if(sum > temp)
			if(sum < min)
		 		min = sum; 
	} while(next_permutation(a, a + len));
	if(min == 1000000) {
		printf("不存在");
		return;	
	}
	printf("%d", min);
}
int main() {
	int num = 9876;  //9876:不存在  //1233:1323  //1323:1332 
	solve(num);
	return 0;
}

O(n)的代码不会。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 答:以下是一个程序的设计,它可以根据标准输入获得一个自然数,并打印出所有大于10且小于该自然数的超完全数字不变数的倒序排列:#include <stdio.h> // 计算一个数是否是超完全数字不变数 int is_perfect_digital_invariant(int n) { int sum = 0; // 计算每一位数字的和 while (n > 0) { sum += n % 10; n /= 10; } // 返回是否是超完全数字不变数 return (sum == 10); } // 根据标准输入获得一个自然数,并打印出所有大于10且小于该自然数的超完全数字不变数的倒序排列 int main() { int n; // 获得一个自然数 printf("Please enter an integer: "); scanf("%d", &n); // 打印超完全数字不变数 printf("The perfect digital invariants which are less than %d are:\n", n); for (int i = n - 1; i >= 10; i--) { if (is_perfect_digital_invariant(i)) printf("%d\n", i); } return 0; } ### 回答2: 超完全数字不变数是指一个数字,它自身的每一个位数的平方和等于它本身。现在,我将设计一个程序,根据标准输入获得一个自然数,然后打印出所有大于十且小于该自然数的超完全数字不变数的倒序排列。 首先,我们需要判断一个数字是否为超完全数字不变数。可以通过以下步骤实现: 1. 将输入的自然数转换为字符串。 2. 遍历字符串的每一个字符,将其转换为数字。 3. 对每个数字进行平方运算,并将结果累加到一个变量。 4. 最后,比较累加结果与原数字是否相等即可判断是否为超完全数字不变数。 接下来,我们可以使用一个循环来遍历从11到输入自然数的范围,并对每个数字进行超完全数字不变数的判断。如果判断为真,则将该数字添加到一个列表。 最后,我们将使用内置的倒序排序函数对列表进行排序,然后依次打印出排序后的结果。 下面是完整的程序代码: ```python def is_superperfect(n): n_str = str(n) sums = 0 for digit in n_str: square = int(digit) ** 2 sums += square return sums == n def print_reverse_superperfect_numbers(n): numbers = [] for i in range(11, n): if is_superperfect(i): numbers.append(i) numbers.sort(reverse=True) for number in numbers: print(number) # 从标准输入获得一个自然数 n = int(input("请输入一个自然数:")) # 打印所有大于十且小于该自然数的超完全数字不变数的倒序排列 print_reverse_superperfect_numbers(n) ``` 这个程序可以通过输入一个自然数,打印出所有大于十且小于该自然数的超完全数字不变数的倒序排列。希望对你有帮助! ### 回答3: 要设计一个程序来实现上述功能,可以按照以下步骤进行: 1. 接收标准输入的自然数n。 2. 创建一个空列表,用于存储大于10且小于n的超完全数字不变数。 3. 使用循环从11开始遍历到n-1,对于每个数字num进行以下判断: - 将num转换为字符串,并计算其长度length。 - 对num进行平方操作,得到结果square。 - 将square转换为字符串,并截取其长度为length的部分。 - 如果截取结果等于num,则说明num是超完全数字不变数,将其添加到列表。 4. 对列表进行倒序排列。 5. 使用循环遍历列表,并打印每个元素。 以下是一个示例代码实现: ```python n = int(input("请输入一个自然数:")) numbers = [] for num in range(11, n): length = len(str(num)) square = str(num ** 2)[:length] if square == str(num): numbers.append(num) numbers.sort(reverse=True) for num in numbers: print(num, end=" ") ``` 这个程序首先获取用户输入的自然数n,然后通过循环从11开始遍历到n-1。对于每个数字num,它将转换为字符串并计算长度length。然后对num进行平方操作,并将结果转换为字符串。利用切片操作截取square字符串的长度为length的部分,并与num进行比较。如果相等,则将num添加到列表numbers。最后,对列表进行倒序排列,并使用循环遍历列表并打印每个数字
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值