寻找数字的总和?

时间:2019-09-12 06:32:04

标签: c sum-of-digits

我使用for循环尝试了此问题,但没有得到指定的正确输出。我不知道我的代码有什么问题?

#include <stdio.h>
int main()
{    
    int T,N;    
    scanf("%d %d" ,&T,&N);

    for(int i=N;i>0;i=i/10)
    {
        int r=N%10;
        int sum=0;
        sum=sum+r;
        printf("The sum is : %d" ,sum);   
    }    
}

总和为:5总和为:5总和为:5总和为:5总和为:5

输出是这样的,而我们只需要打印数字的总和

1 个答案:

答案 0 :(得分:3)

for(int i = N; i > 0 ; i = i/10)
{
    int r = N % 10; // calculating remainder of UNMODIFIED input, so will
                    // ALWAYS be last digit

    int sum = 0;    // you are initializing the sum to 0 for every single iteration

    sum = sum + r;  // so this will *always* result in 0 + N % 10

    printf("The sum is : %d", sum);
}

要解决此问题,您只需一次就初始化总和以收集所有一位数字。此外,您需要使用 modified 值:

int sum = 0;
for(int i = N; i > 0 ; i = i/10)
{
    int r = i % 10;
    //      ^  (!)
    sum += r; // alternative variant...
    printf("The sum is : %d\n", sum);
    //                     ^^ for better output formatting
}

直到现在,我们仍在每次迭代中打印总和。如果您想了解总和的演变方式(假设输入为1210),那么可能很有用:

The sum is 0
The sum is 1
The sum is 3
The sum is 4

但是,实际上,您只想打印结果,不是吗?因此,您也可以将打印移出循环:

for(...)
{
    ...
}
printf("The sum is : %d\n", sum);

替代变体:如果以后仍然不需要N的值,则可以直接对其进行迭代:

for(  ; N > 0; N /= 10)
//  ^ empty initialization, nothing to be done...
{
    int r = N % 10; // NOW using N is fine...
    ...
}

最后:如果与!=而不是>进行比较,则也可以覆盖负输入(因为您使用 signed 整数...)。

根据问题进行编辑:

  

它问这样的输入和输出。输入3 12345 31203 2123输出15 9 8

在这种情况下,您需要一个双循环:

int t;
// well, actually, you should check if you did get correct input:
if(scanf("%d", &t) != 1))
{
    // invalid input
    // appropriate error handling, e. g. printing a message and:
    return -1;
}

for( ; t > 0; --t) // handles the number of tasks to solve
{
    int n; // inside loop: read in a new value with every task
    scanf("%d", &n); // TODO: check input, see above

    int sum = 0;
    for(...) { ... } // loop handling the input value, see above
    printf(...);
}