【问题标题】:Write a program in C that outputs the smallest natural number greater or equal to n whose all digits are even用 C 语言编写一个程序,输出大于或等于 n 且所有数字都是偶数的最小自然数
【发布时间】:2016-12-24 10:06:38
【问题描述】:

用 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;
}

为什么这不起作用?

【问题讨论】:

  • 使用调试器并单步执行代码以逐行查看它在做什么。
  • 我该怎么做?
  • 你可以阅读小tuto。这将是一个开始。
  • 嗯,第一步是学习使用调试器。如何?同样的方式你会学到很多其他的东西。您进行基础研究 - 互联网搜索显然是第一步。

标签: c math base


【解决方案1】:

您在将 i 设为 0 后打印它,即除以 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;
}

【讨论】:

  • 为什么投反对票?请解释一下,以便我可以使这个答案更有用
  • 我没有对你投反对票。我仍然不明白我的代码有什么问题,“您正在检查 41/10 %2 == 0 是否正确,即使您的条件不满足也是如此”是什么意思。什么条件?
  • @Stargateur 除了要求他格式化他的代码之外,你的抱怨很严厉。在for 循环之外声明i 并没有错。此外,OP 已经展示了解决此问题的蛮力方法,因此给他蛮力答案以帮助他解决问题并没有错。
  • @Now_now_Draco_play_nicely 我很糟糕,现在我看到你打印的问题 i 将它除以 10 直到它变为 0。所以,现在它每次都会打印 0。相反,您应该将 i 的值转移到其他变量,这样您就可以更改它的值
  • @Now_now_Draco_play_nicely 在下面查看我的答案,我为此使用了不同的方法。
【解决方案2】:

添加到@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); 
}

【讨论】:

    【解决方案3】:

    到目前为止发布的解决方案搜索所有大于或等于 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 = n % 10;
    
                r += c * d;
    
                // Since we are incrementing the current digit (or a more           
                // significant one), we must set every less significant             
                // digits to zero.                                                   
                r -= r % c;
            }
    
            c *= 10;
            n /= 10;
        }
    
        return r;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 2018-02-18
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多