2016-08-30 76 views
0

我需要找到一个数字的数字的总和。例如,的数量1123的位数之和为1 + 1 + 2 + 3 = 7找到一个数字的数字总和(在c)

我的主意:

1)用户输入和整数

2)I计算的数数字中的数字(在上述情况下为-4位)

3)比使用for循环我将用户数除以10的幂数...直到数字位数(不包括最后一个)并将这些数字相加。

这里是我的代码:

int main (void) 
{ 
    int result,sum,n; 
    int div = 10,counter = 0,number; 

    printf("Enter the integer:"); 
    scanf("%i",&number); 
    while(result >0){ 
     result = number/div; 
     div *= 10; 
     ++counter; 
    } 
    printf("The number consists of %i digits\n",counter); 
    sum = 0; 

    for(n=1;n<counter;++n){ 
     sum += number/pow(10,n); 
    } 
    printf("%i",sum); 

    return 0; 


} 

第一部分(while循环)单独工作正确。但是与第二部分(for循环)一起,它给了我不正确的结果(while循环中的0位数和总和也为零)。你能解释为什么会发生? 我该如何纠正我的解决方案?

P.S我知道存在我的问题的更有效的解决方案,但我想用我自己的算法。

+1

不直接输入到一个int。输入为一个字符串。这使得长度计算变得微不足道,然后你将字符串视为字符aarray并循环单个数字,将它们转换为int并将其相加 –

+0

通过除以10的幂数,您将不会获得数字。你需要和它一起使用模数'10'。 –

+0

'div * = 10;'溢出后会出现问题。 – chux

回答

2

几个问题在这里:

  • 当你第一次进入while循环,result尚未初始化。尝试读取未初始化的变量是undefined behavior
  • 当您进行分区时,您不会添加数字。您将添加数字除以10的连续幂。在1123的情况下,您实际上正在添加112 + 11 + 1。您需要使用模数而不是除数来得到数字。

你可以做加法,并在单回路数字计数如下:

sum = 0; 
while(number > 0){ 
    sum += number % 10; 
    number /= 10; 
    ++counter; 
} 
printf("The number consists of %i digits\n",counter); 
printf("%i",sum); 
1

简单得多:

result = number; 
sum = 0; 
counter = 0; 
while(result != 0){ 
    sum += result % 10; 
    result /= 10; 
    ++counter; 
} 

printf ("Counter:%d sum:%d\n", counter, sum); 
0

有在代码中的许多错误,但总体而言,整个做法是错误的。计数数字是不必要的。

一个更简单的方法是:

unsigned temp = number, sum = 0; 
while (temp) { 
    sum += temp % 10; 
    temp /= 10; 
} 

请注意,您知道什么时候停止循环,因为temp变为0(temp为条件相当于temp != 0)。您无需事先知道数字的位数。

0

如果你的代码去,这会工作:

for(n=1;n<=counter;++n){ 
    sum += number%10; 
    number /= 10; 
} 
printf("%d",sum); 
1

首先,以获得最佳的调试,使用一些具有不同的数字,如12345

要进行调试,分别计算和打印数字并累积数字。也就是说,不是sum += <... complex code ...>,像这样做:

int digit = ... 
printf("Next digit is %i\n", digit); 
sum += digit; 

而且(你应该通过调试发现这一点,但它是相当明显直接注),你的数字计算算法是错误的。做这样的事情:

int div = 1; 
for (...) 
{ 
    digit = number/div % 10; 
    div *= 10; 
} 

请注意,我不使用pow在这里,因为pow使用了浮点算法,它的精确度有限。如果您的int具有64位精度(不太可能但可能),浮点数将为大数字计算无意义(它只有53位精度)。

+0

关于'pow()'限制的很好的见解。 – chux

0

简单的解决方案:

int c, n=0, sum=0; 
printf("Enter number"); 
while((c=getchar())!='\n') { // IMPORTANT: '\n' in unix, '\r' in windows 
    if(c<'0' || c>'9') { 
     printf("Bad value"); 
     break; 
    } 
    sum+=c-'0'; // c is the ASCII code of the digit, so you have to subtract an offset 
    n++; 
} 
printf("Number of digits: %d", n); 
printf("Sum of digits: %d", sum; 
+0

谢谢,我已经修复了它们,并且还添加了一个if来检查字符是否真的是数字。 –

+0

对。这是如果(c <'0' || c>'9')。今天很多打字错误... –

+0

你可以使用'isdigit(char)'函数来检查它是否是一个数字,'atoi(char *)'从char得到一个整数 – Tiko