在C中编写一个程序,该程序将采用自然数n并输出大于或等于n
的最小自然数,其所有数字均为十进制数。例如,如果n = 16
,则应输出20
,如果n = 41
,则应输出42
。
我尝试过:
#include <stdio.h>
int main(void) {
int n, i, condition = 0;
scanf("%d", &n);
for (i = n; i >= n; i++) {
if (i % 2 == 0) {
i = i / 10;
while (i > 0) {
if (i % 2 == 0) {
i = i / 10;
condition = 1;
} else {
break;
}
}
} else {
condition = 0;
}
if (condition == 1) {
printf("%d", i);
break;
}
}
return 0;
}
为什么这不起作用?
答案 0 :(得分:2)
在将i设为0之后再打印i,即将其除以10,直到第一个数字到来。因此,它会在每种情况下都打印0。
相反,您应该尝试将i的值分配给另一个变量,这样您就不必更改i。在第一次迭代变为0之后,由于for循环中的要求i> = n,它不会进行其他迭代。
#include <stdio.h>
int main(void) {
int n;
scanf("%d", &n);
for (int i = n; i >= n; i++){
int num = i;
int cond = 0;
while(num>0){
int dig = num%10;
if(dig%2 != 0){
cond = 1;
break;
}
num/=10;
}
if (cond ==0){
printf("%d",i);
break;
}
}
return 0;
}
答案 1 :(得分:1)
添加到@ Sanjay-sopho回答,您可以尝试两种方法:
这就是迭代版本的样子:
#include <stdio.h>
#include <stdlib.h>
int check_even(int n);
int
main(void) {
int i, n;
printf("Enter n: ");
if (scanf("%d", &n) != 1 || n < 1) {
printf("Invalid entry, must be a natural number!\n");
exit(EXIT_FAILURE);
}
for (i = n; i >= n; i++) {
if (check_even(i)) {
printf("%d\n", i);
break;
}
}
return 0;
}
int
check_even(int n) {
int i;
for (i = n; i > 0; i /= 10) {
if (i % 2 != 0) {
return 0;
}
}
return 1;
}
或者你可以试试这个递归函数:
int
check_even_rec(int n) {
if (n == 0) {
return 1;
} else if (n % 2 != 0) {
return 0;
}
return check_even_rec(n /= 10);
}
答案 2 :(得分:0)
到目前为止发布的解决方案搜索所有大于或等于n的数字,直到找到具有全偶数位的数字。这非常低效。
更好的方法是从右到左扫描一次数字并调整它们以直接获得所需的结果:
// assume n >= 0
int next (int n)
{
int r = 0; // result
int c = 1; // coefficient (power of ten) of the current digit
// Scan digits from right to left.
while (n) {
// current digit
int d = n % 10;
if (d % 2 == 0) {
r += c * d;
}
else {
// Make sure we handle the case d == 9 correctly.
n++;
d = (d + 1) % 10;
r += c * d;
// Since we are incrementing the current digit (or a more
// significant one), we must set every less significant
// digit to zero.
r -= r % c;
}
c *= 10;
n /= 10;
}
return r;
}