偶数和奇数位置的数字总和

时间:2017-09-17 17:44:58

标签: c sum

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;
}

但是我不明白这段代码是如何工作的(我知道它会与sumevensumodd互换,但为什么c是偶数呢?

1 个答案:

答案 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;
}