int sumeven = 0, sumodd = 0, num, remainder, c;
scanf("%d", &num);
c = 0;
while (num) {
remainder = num % 10;
c++;
if (c % 2 == 0) {
sumeven = sumeven + remainder;
} else
if(c % 2 != 0) {
sumodd = sumodd + remainder;
}
num = num / 10;
}
printf("sum of digits at even pos: %d\n sum of digits at odd pos: %d",
sumeven, sumodd);
所以问题是当num
中有一个奇数位数时,程序运行正常,它分别给出了偶数位置和奇数位置的数字之和,但是当存在偶数时会出现问题的数字。当存在偶数位数时,sumeven
存储奇数位的总和,反之亦然。为什么会发生这种情况以及如何解决?
在网上搜索一下,我发现这可以修复,在while循环后添加以下代码
if (c % 2 == 0) {
temp = sumeven;
sumeven = sumodd;
sumodd = temp;
}
但是我不明白这段代码是如何工作的(我知道它会与sumeven
和sumodd
互换,但为什么c
是偶数呢?
答案 0 :(得分:2)
非常简单的回答你从头到尾算数,所以对于奇数个数字你需要交换结果。
#include <stdio.h>
int sum(long long n, unsigned *odd, unsigned *even)
{
int e = 0;
int digit;
*odd = *even = 0;
while(n)
{
digit = n % 10;
if(e & 1)
*even += digit;
else
*odd += digit;
n /= 10;
e++;
}
if(e & 1)
{
unsigned tmp = *odd;
*odd = *even;
*even = tmp;
}
return e;
}
int main(void) {
unsigned e,o;
int num = sum(123, &o, &e);
printf("num = %d odd = %d\teven = %d\n", num, o, e);
return 0;
}