繁体   English   中英

c 中五位数的总和?你能发现错误吗?

[英]Sum of Digits of a Five Digit Number in c?Could you spot the error?

顺便说一句,我知道这不是最有效的方法,但如果我想像我一样做,我做错了什么? 任务是:给定一个五位整数,打印其数字之和。

约束:10000 <= n <= 99999
样本输入: 10564
样本输出: 16

我的代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
    int n, sum;
    int remainder_array[4] = { n % 1000; n % 100, n % 10, n };
    int digits_array[4];

    scanf("%d", &n);
    // Complete the code to calculate the sum of the five digits on n.
    if (10000 <= n && n <= 99999) {
        else if (remainder_array[0] = 0) {
            digits_array[0] = (n - remainder_array[0]) / 1000; 
            n = remainder_array[1];
        } else if (remainder_array[1] != 0) {
            digits_array[1] = (n - remainder_array[1]) / 100;
            n = remainder_array[2];
        } else if (reminder_array[2] != 0) {
            digits_array[2] = (n - remainder_array[2]) / 10;
            n = remainder_array[3];
        } else if (reminder_array[3] != 0) {
            digits_array[3] = n - remainder_array[3];
        } else {
            printf("%d", n / 1000);
        }
        sum = digits_array[0] + digits_array[1] + digits_array[2] + digits_array[3];
        printf("%d", sum);
    }
    return 0;
}

您的代码中有多个问题:

  • 读取n的值之前,先从n的值初始化remainder_array n
  • 初始值设定项不正确:分隔符应该是, , 不是; .
  • 你用else开始if主体内的语句,这是一个语法错误。
  • 测试if (remainder_array[0] = 0)remainder_array[0]0并评估为 false。
  • remainder_array数组拼写错误, reminder_array数组

您的方法很好,但是在阅读并检查n之后,您应该使用实际的余数(其中 5 个)初始化remainder_array数组:

#include <stdio.h>

int main() {
    int n;

    if (scanf("%d", &n) == 1 && 10000 <= n && n <= 99999) {
        int remainder_array[5] = { n / 10000, n / 1000 % 10, n / 100 % 10, n / 10 % 10, n % 10 };
        int sum = remainder_array[0] + remainder_array[1] + remainder_array[2] +
                  remainder_array[3] + remainder_array[4];
        printf("%d\n", sum);
    }
    return 0;
}

请注意,您实际上并不需要这个remainder_array ,您可以只写:

#include <stdio.h>

int main() {
    int n;

    if (scanf("%d", &n) == 1 && 10000 <= n && n <= 99999) {
        int sum = n / 10000 + n / 1000 % 10 + n / 100 % 10 + n / 10 % 10 + n % 10;
        printf("%d\n", sum);
    }
    return 0;
}

这是一个更具可读性和更通用的版本:

#include <stdio.h>

int main() {
    int n;

    if (scanf("%d", &n) == 1 && 10000 <= n && n <= 99999) {
        int sum = 0;
        while (n >= 10) {
            sum += n % 10;
            n = n / 10;
        }
        sum += n;
        printf("%d\n", sum);
    }
    return 0;
}

你的算法太复杂了,没有数组可以更容易地完成。

int sumof5LSD(int x)
{
    int result = 0;
    for(int digit = 1; digit <=5; digit++)
    {
        result += abs(x % 10);
        x /= 10;
    }
    return result;
}

int main(void)
{
    printf("SUM: %d", sumof5LSD(10564));
}

https://godbolt.org/z/bcdM8P

或者如果您不允许使用循环:

int sumof5LSD(int x)
{
    int result = 0;
    result += abs(x % 10);
    x /= 10;
    result += abs(x % 10);
    x /= 10;
    result += abs(x % 10);
    x /= 10;
    result += abs(x % 10);
    x /= 10;
    result += abs(x % 10);

    return result;
}

最好使用函数来执行类似的任务。

带有 scanf 的版本

int main(void)
{
    int n;
    scanf("%d", &n);
    printf("SUM of 5 digits of %d = %d", n, sumof5LSD(n));
}

它还将计算负数的 5 位数字之和

除了@P_J_ 和@chqrlie 提到的错误和修改之外,我注意到一些主要的逻辑错误和对代码中基本概念的误解(假设第一个 else if 被 if 替换)你已经反复给出 else if 语句,现在这样做的作用是,只要它遇到的第一个条件为真,它就会在内部执行块并退出分支,即 else if 之后的剩余语句未执行,这可能会导致程序中的重大逻辑错误。

 if (10000 <= n && n <= 99999) {
        else if (remainder_array[0] = 0) {
            digits_array[0] = (n - remainder_array[0]) / 1000; 
            n = remainder_array[1];
        } else if (remainder_array[1] != 0) {
            digits_array[1] = (n - remainder_array[1]) / 100;
            n = remainder_array[2];
        } else if (reminder_array[2] != 0) {
            digits_array[2] = (n - remainder_array[2]) / 10;
            n = remainder_array[3];
        } else if (reminder_array[3] != 0) {
            digits_array[3] = n - remainder_array[3];
        } else {
            printf("%d", n / 1000);
        }

在此处输入图片说明

现在在这张图片中,如果您注意到输出,您可以看到digits_array[1-3] 为0,这是因为上述原因(它是零,因为我事先已对其进行了初始化),因此总和为零。

第二个逻辑错误是你将一个 5 位数字除以 1000 这会给你千位,即在示例 10546 这一步将导致 10 这是错误的,再举一个例子 12233 不是数字的总和应该导致 11但是你会得到 20,因为当你将 12233 除以 1000 时,digits_array (digit_array[0]) 的第一个值是 12,所以整个输出出错了。 所以要纠正这个除以 10000(仅适用于这个程序语句,因为它有 5 位数字)。

但是,如果您希望在不更改算法的情况下继续,那么此代码应该可以正常工作。

    #include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
    int n, sum;
    int digits_array[5]={0}; //5 because it is a five digit number.
    scanf("%d", &n);
    int remainder_array[] = { n % 1000, n % 100, n % 10, n };//This is still a useless array this is kept so as to enter if.
    // Complete the code to calculate the sum of the five digits on n.
    if (10000 <= n && n <= 99999) {
        if (remainder_array[0] != 0) {
            digits_array[0] = (n) / 10000;//subtracting n with contents of remainder_array added to the complexity of the algorithm so took out the statement.
            n =(n)%10000;
        } if (remainder_array[1] != 0) {
            digits_array[1] = (n) / 1000;
            n =(n)%1000;
        } if (remainder_array[2] != 0) {
            digits_array[2] = (n) / 100;
            n =(n)%100;
        } if (remainder_array[3] != 0) {
            digits_array[3] = (n)/10;
            n=(n)%10;
        } 
          digits_array[4]=n;//the last element of the number 
        }
        sum = digits_array[0] + digits_array[1] + digits_array[2] + digits_array[3]+digits_array[4];
        printf("%d",sum);
    return 0;
}

注意:这个程序不是最好的方法,一些更改参考其他答案以获得更有效的代码,并在进入嵌套 if 条件之前获得基础知识。

享受编码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM