给定一个正整数 𝑛 n。找到一个最小的整数,其十进制表示的长度为 𝑛 n,并且仅由 3 3 和 6 6 组成,使其同时能被 33 33 和 66 66 整除。如果不存在这样的整数,输出 − 1 −1。C语言代码
时间: 2024-11-10 16:26:52 浏览: 19
cpp代码-最小未出现的正整数
为了解决这个问题,我们可以使用回溯法。我们需要构造一个数字,只包含3和6,且能够同时被3和6整除,即它需要既能被9(3的平方)整除,又能被18(6的倍数)整除。因为9和18的最大公约数是9,所以这个数字也必须是9的倍数。
下面是用C语言实现的一个示例:
```c
#include <stdio.h>
#include <stdbool.h>
bool checkDivisible(int n) {
int sum = 0;
while (n > 0) {
if (n % 10 != 3 && n % 10 != 6)
return false;
sum += n % 10;
n /= 10;
}
return sum % 9 == 0;
}
int findMinNumber(int n) {
// 如果n太小,不可能构建所需的数字,直接返回-1
if (n <= 1)
return -1;
// 从最小的两位数33开始尝试
for (int i = 1; i <= 9; i++) {
int num = 3 * pow(10, i) + 3; // 构建只含3的初始数
if (checkDivisible(num))
return num;
}
// 否则继续增加6,直到找到满足条件的数
for (int i = 1; ; i++) {
int num = 3 * pow(10, i) + 6;
if (checkDivisible(num))
return num;
}
}
int main() {
int n;
printf("Enter the value of n: ");
scanf("%d", &n);
int result = findMinNumber(n);
if (result == -1)
printf("-1\n");
else
printf("%d\n", result);
return 0;
}
```
阅读全文