用c语言写一个由1-9组成的九位数,每个数字只出现了一次,且这个九位数由高到低位前i位能被i整除
时间: 2023-06-10 09:08:22 浏览: 104
以下是一种可能的解法:
```c
#include <stdio.h>
#include <stdbool.h>
bool is_valid(int num) {
int digits[9] = {0};
for (int i = 0; i < 9; i++) {
int digit = num % 10;
if (digit == 0 || digits[digit - 1] != 0) {
return false;
}
digits[digit - 1] = 1;
num /= 10;
}
return true;
}
int main() {
for (int num = 987654321; num >= 123456789; num--) {
if (is_valid(num)) {
bool valid = true;
for (int i = 1; i <= 9; i++) {
int prefix = num / (int)pow(10, 9 - i);
if (prefix % i != 0) {
valid = false;
break;
}
}
if (valid) {
printf("%d\n", num);
break;
}
}
}
return 0;
}
```
解释一下这个程序的思路:
首先,我们需要生成所有由1-9组成的九位数。由于我们希望这个九位数由高到低位前i位能被i整除,因此我们从大到小枚举这些数,这样可以保证我们找到的第一个满足要求的数是最大的。
接着,我们需要检查这个九位数中每个数字是否只出现了一次。为此,我们可以将这个数按位分解,依次检查每个数字是否出现过,并记录下来,如果出现过或者包含0,那么这个数就不合法。
最后,我们需要检查这个九位数由高到低位前i位是否能被i整除。为此,我们可以将这个数分解成前i位和后面的部分,然后检查前i位是否能被i整除即可。
注意,这个程序中用到了一个库函数 `pow()`,它可以计算一个数的幂,需要在头文件中包含 `math.h`。