[英]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));
}
或者如果您不允许使用循环:
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.