2017-11-25 63 views
-1
#include <stdio.h> 
#include <stdlib.h> 

#define TEN 10 
int main() 
{ 
int number = 0; 
int digit = 0; 
int last_digit = 0; 
int digit_sum = 0; 
int i = 0; 
while (i == 0) 
{ 
printf("Please Enter A Positive Number! \n"); //explaining 
scanf("%d",&number); 
if (number > 0) 
{ 
    i++; 
} 

} 

    while (number > 0) 
    { 
    digit = number % TEN; //breaking number into digits 
    number /= TEN; 

    if (last_digit != digit) //comparing digits 
    { 
     last_digit = digit; 
     digit_sum += digit; 
    } 


    } 


    printf("The Sum Of The Digits Is : %d",digit_sum); 
    return 0; 

}(C)代码着的工作要条件


代码将划分成数位并检查是否有被欺骗的数字,万一有,只有其中一人将计算例如:3211 3 + 2 + 1,但我的问题是,该代码将不会像31211数字工作我感谢任何形式的帮助。

+0

一个可能的解决方案将输入作为字符串读取,对其进行排序(例如,“31211”变为“11123”),并删除连续的重复项(所以字符串“11123”变为“123”),然后执行求和。 –

+2

欢迎来到SO。请参观参观,了解要问什么问题以及如何。这里没有问题。此外,请在此处张贴时请正确缩进代码。 –

+0

你能给我一个例子吗? – SaKaMoToSaN15

回答

2

该代码不起作用,因为不能保证重复会出现连续的方式。你的代码处理的不是其他方式。这就是它失败的原因。

一个简单的解决方案是考虑一个10个元素的数组,其中你将保持计数哪个元素出现和哪个没有。

这个想法是将数字映射到10元素数组的数组下标。初始化为0

... 
int digitAppeared[10]={0}; 
while (number) 
{ 
    digit = number % TEN; //breaking number into digits 
    number /= TEN; 
    digit_sum += (1 - digitAppeared[digit]) * digit; 
    digitAppeared[digit] = 1; 
} 
... 

为了给你一个明确的概念这条线基本检查元素是否出现与否并按照其结果会增加数字。

如果数字D出现然后digitAppeared[D]=1 并且如果它没有然后digitAppeared[D]=0

如果它第一次出现,我们将它添加到digitsum。这就是为什么(1-digitAppeared[D])会告诉我们是否添加它。

digit_sum += (1 - digitAppeared[digit]) * digit; 
+0

所以我可以修复它,所以它将以无条件的方式工作?我一直在努力解决这个问题。 (我注意到了) – SaKaMoToSaN15

+0

@ SaKaMoToSaN15 .:是的,你可以。只要conmsider采取阵列就可以了。跟踪elelemts。 – coderredoc

+0

对不起,如果我有点唠叨我是一个初学者,所以我不真的知道如何使用数组''是否有办法做到这一点没有arra'ys? – SaKaMoToSaN15

0

将数字转换为字符串使用itoa()。排序,然后穿行,寻找唯一的编号,做你的计算

+1

请注意,'itoa'不是一个标准的C函数,它可能无处不在。 –

+0

好吧,没问题,然后创建一个数组是一个选项。 32222 - > [3,2,2,2]然后进行计算 – stack26

0

您可以标记该数字已经通过使用由done以下程序代表设置的逻辑标志补充说:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define TEN 10 
int main() 
{ 
int number = 0; 
int digit = 0; 
int last_digit = 0; 
int digit_sum = 0; 
int i = 0; 
int done[10]; 
while (i == 0) 
{ 
printf("Please Enter A Positive Number! \n"); //explaining 
scanf("%d",&number); 
if (number > 0) 
{ 
    i++; 
} 

} 
    memset(done,0,sizeof(done)); 
    while (number > 0) 
    { 
    digit = number % TEN; //breaking number into digits 
    number /= TEN; 
     if(done[digit] == 0) 
     { 
     digit_sum += digit; 
     done[digit] = 1; 
     } 
    } 


    printf("The Sum Of The Digits Is : %d",digit_sum); 
    return 0; 
}