C语言 计算先前输入的某些数字的总和

du7egjpx  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(139)

这个程序应该计算所有数字的和,这些数字的位数是按降序排列的。如果数字不是整数,它会阻止你输入。我想这个问题可能是由于sum变量,但我不知道如何修复它。编辑:根据@user3386109的请求,我得到的输出如下:4321 75 56 4,79 0
和应该是4396,因为和4321和75。不是0。对不起,不清楚的问题,我是相当新的。

int n, last, secondlast, sum, c = 0;
int temp;

while (scanf("%d", &n) == 1) {
    sum = 0;
    while (temp > 0) {
        last = temp % 10;
        secondlast = (temp / 10) % 10;
        if (secondlast > last) {
            c++;
            sum = sum + temp;
        }
        temp = temp / 10;

    }
}

if (c == 0) {
    printf("There are no numbers that meet the requirements\n");
}
else {
    printf("%d\n", sum);
}
fwzugrvs

fwzugrvs1#

正如@支持乌克兰评论的那样,这段代码完成了这项工作。

#include <stdio.h>
 
int descendingDigits(int n)
{
    int current = n % 10;
    n = n / 10;
    while(n)
    {
        int this = n % 10;
        if (this <= current) return 0;
        current = this;
        n = n / 10;
    }
    return 1;
}
 
int main(void) {
 
    int sum = 0;
    int c = 0;
    int n = 0;
 
    while (scanf("%d", &n) == 1) {
        if (descendingDigits(n))
        {
            sum = sum + n;
            c = 1;
        }
    }
 
    if (c == 0) {
        printf("There are no numbers that meet the requirements\n");
    }
    else 
    {
        printf("%d\n", sum);
    }
 
    return 0;
}
nvbavucw

nvbavucw2#

%10运算实际上并不是判断数字是否为降序的最佳方法。它确实有效,但使用scanf将输入转换为整数似乎有些矫枉过正,因为如果将其保留为字符串,则更容易知道数字是否按顺序排列。检查字符串的数字是否为降序并仅在它们为降序时才转换为整数值是很有吸引力的。但是两次解析字符串似乎不是个好主意。读取输入字符串,不进行转换,然后计算整数值,同时查看数字是否降序。这很美观,因为可以最大限度地减少计算。(例如,如果输入字符串是“47901”,就不应该浪费CPU周期将其转换为整数47901;在您看到7不小于4之后,您可以放弃)。
例如:

#include <ctype.h>
#include <stdio.h>

/* If the string s represents an integer
 * with (strictly) descending digits, return
 * its integer representation (base 10).  Else
 * return 0.
 */
unsigned
is_descending(const char *s)
{
    unsigned rv = 0;
    int last = '9' + 1;
    while( *s ){
        if( isdigit(*s) && *s < last ){
            rv = 10 * rv + *s - '0';
        } else {
            return 0;
        }
        last = *s++;
    }
    return rv;
}

int
main(int argc, char **argv)
{
    char buf[64];
    unsigned sum = 0;
    while( scanf("%63s", buf) == 1 ){
        sum += is_descending(buf);
    }
    printf("sum: %u\n", sum);
    return 0;
}

请注意,这不能很好地处理负数,但不清楚如何处理负数。留给读者作为练习。

相关问题