我使用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
输出是这样的,而我们只需要打印数字的总和
答案 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(...);
}