数字总和程序不能正确回答c中的负数

数字总和程序不能正确回答c中的负数,c,C,我尝试了这个方法,它可以很好地处理正整数,但是当我输入一个负整数时,比如:-323=>-8 它应该是-3+2+3=2,而不是-3-2-3=-8 我尝试使用abs函数,但它仍然不能正常工作。您可以使用条件运算符存储符号值,如int sign=(n>=0?1:-1)如下所示- printf("Sum Digit Program\n"); int n,re, sum = 0; printf("Enter an integer n="); scanf("%d", &n); whi

我尝试了这个方法,它可以很好地处理正整数,但是当我输入一个负整数时,比如:-323=>-8 它应该是-3+2+3=2,而不是-3-2-3=-8
我尝试使用abs函数,但它仍然不能正常工作。您可以使用条件运算符存储
符号
值,如
int sign=(n>=0?1:-1)如下所示-

    printf("Sum Digit Program\n");
int n,re, sum = 0;
    printf("Enter an integer n="); scanf("%d", &n);
while(n){
    re = n % 10;
    sum = sum + re;
    n = n / 10;
}
printf("Sum digit = %d", sum);
return 0;
}
#包括
#包括
/*
*@返回数字和的简短逻辑
*/
整数数字和(整数n)
{
整数符号=(n>=0?1:-1);
整数和=0;
n*=符号;
while(n)
{
如果(n<10)
总和+=(符号*(n%10));
其他的
总和+=n%10;
n/=10;
printf(“总和:%d,n:%d\n”,总和,n);
}
printf(“总和:%d,n:%d\n”,总和,n);
回报金额;
}
/*
*@简短的驱动程序功能
*/
int main(int argc,char*argv[])
{
int num=-323;
printf(“总和:%d\n”,数字总和(num));
返回0;
}

其思想是将数字的符号存储到一个单独的变量中,并在
n<10

OP几乎拥有它时使用它。只需将MSDigit视为已签名。所有其他数字,使用abs(rem)
。适用于
INT\u MIN

#include <stdio.h>
#include <stdlib.h>
/*
 * @brief   Logic for returning sum of digits
 */
int digi_sum(int n)
{
    int sign = (n >= 0 ? 1 : -1);
    int sum = 0;
    n *= sign;
    while (n)
    {
        if (n < 10)
            sum += (sign * (n % 10));
        else
            sum += n % 10;
        n /= 10;
        printf("Sum: %d, n: %d\n", sum, n);
    }
    printf("sum: %d, n: %d\n", sum, n);
    return sum;
}
/*
 * @brief   Driver function
 */
int main(int argc, char *argv[])
{
    int num = -323;
    printf("Sum: %d\n", digi_sum(num));
    return 0;
}

您可以在循环的第一行添加一个条件,以确保当
n<10
时,
sum
到目前为止为正,然后它将对最小的数字进行减法(如果它也有)。那么您的循环应该如下所示:

printf("Sum Digit Program\n");
int sum = 0;
printf("Enter an integer n="); 
scanf("%d", &n);
while (n) {
  int re = n % 10;
  n = n / 10;
  sum += n ? abs(re) : re; // At MSDigit when n==0
}
printf("Sum digit = %d", sum);
while(n){
如果(abs(n)<10){
总和=绝对值(总和);
}
re=n%10;
sum=sum+re;
n=n/10;
}

我认为第一个数字需要一个先决条件。 用if-then-else。 解决了的 我更改了输出以查看值

while(n){
        if (abs(n) < 10) {
            sum = abs(sum);
        }
        re = n % 10;
        sum = sum + re;
        n = n / 10;
    }
包括
内部主(空)
{
int-re,n;
整数和=0;
printf(“总和数字程序”);
printf(“输入整数n=”);
scanf(“%d”和“&n”);
while(n)
{
如果(abs(n)<10){
总和=绝对值(总和);
}       
re=(n%10);
sum=sum+re;
n=n/10;
printf(“\n re=%d,n=%d\n”,re,n);
}   
printf(“\n总和=%d\n”,总和);
返回0;
}
使用n=abs(n/10)代替n=n/10

include<stdio.h>

int main(void)
{
 int re,n;
 int sum =0 ;

 printf("Sum Digit Program \n");
 printf("Enter an integer n= "); 
 scanf("%d", &n);

 while(n)
 {
  if (abs(n) < 10) {
        sum = abs(sum);
  }       
 re= (n % 10);
 sum = sum + re; 
 n= n / 10; 

 printf ("\n  re =  %d , n=  %d \n",  re, n); 
 }   
 printf ("\n  sum=  %d \n",sum);
return 0;
}
#包括
#包括
main()
{
printf(“总和数字程序”);
int n,re,和=0;
printf(“输入整数n=”);scanf(“%d”,&n);
while(n)
{
re=n%10;
sum=sum+re;
n=abs(n/10);
}
printf(“总和位数=%d”,总和);
返回0;
}

在我看来,你希望while循环的结尾是
n=abs(n/10)
第一次使用这种方式将其作为-ve处理,随后的所有时间都将其视为正数。在我看来,将-323的数字总和设为-3+2+3有点牵强。你确定这是你真正想要的吗?假设我把它写成-0323(仍然是以10为基数),你想改变答案吗?从数学上讲,这是胡说八道。角格:
n*=符号n==INT\u MIN
时,code>为UB。
#include <stdio.h>
#include <math.h>
main()
{
printf("Sum Digit Program\n");
int n,re, sum = 0;
printf("Enter an integer n="); scanf("%d", &n);
while(n)
    {
    re = n % 10;
    sum = sum + re;
    n =abs(n/10);
    }
printf("Sum digit = %d", sum);
return 0;
}