2014-12-06 42 views
-3

我正在写一个C程序,它应该显示100到1000之间的数字总和为20的所有数字。我在这里试过这段代码,但它当我编译时只显示0作为输出,你能帮助我吗?如果(iVsota == 20)在while循环之外,我也尝试移动。我正在使用Orwell Dev C++ IDE。C程序打印100到1000之间的数字总和为20

#include <stdio.h> 

int main (void) 
{ 
    int iVnos=0; 
    int iOstanek=0; 
    int iVsota=1; 
    int iStevec1=100; 

    for(iStevec1=100; iStevec1<1000; iStevec1++) 
    { 
     while(iStevec1>0) 
     { 
      iOstanek=iStevec1%100; 
      iStevec1=iStevec1/10; 
      iVsota=iOstanek+iVsota; 
      if(iVsota==20) 
      { 
       printf("%i\n", iStevec1); 
      } 
     } 
    } 
    return(0); 

我希望这样更好。

+0

您在两个循环中都使用了'iStevec1'。这个逻辑是完全错误的!一旦达到0,你会在外循环中将它增加到1,并在内循环中回到0(并且它将继续永远运行,因为外循环只有在达到iStevec1 == 1000时才停止)。 – 2014-12-06 08:22:46

+1

采取另一种方法,将数字放在字符缓冲区[]中,然后提取每个字符并用'0'进行减法,即得到所有数字。最好把它放在一个单独的功能例如'int sumOfDigits(int number);' – 2014-12-06 08:25:35

回答

0

这应该为你工作:

(改变变量名称,以便它更易读)

#include <stdio.h> 

int add_digits(int n) { 
    static int sum = 0; 

    if (n == 0) 
     return 0; 

    sum = n%10 + add_digits(n/10); 
    return sum; 

} 

int main() { 

    int start, end; 
    start = 100, end = 1000; 

    for(start = 100; start <= end; start++) { 

     if(add_digits(start) == 20) 
      printf("Number: %d\n", start); 
    } 

    return 0; 

} 

编辑:

(您的代码与解释一起解释)

#include <stdio.h> 

int main() { 

    int iVnos=0; 
    int iOstanek=0; 
    int iVsota=0; 
    int iStevec1=100; 
    int temp; //temp needed 

    for(iStevec1=100; iStevec1<=1000; iStevec1++) 
    { 

     temp =iStevec1; //assign number to temp 
     iVsota=0; //set sum every iteration to 0 
     while(temp>0) 
     { 
      iOstanek=temp%10; //You need only % 10 to get the last digit of a number 
      temp = temp/10; //'delete' last digit of the number 
      iVsota+=iOstanek; //add digit to sum 

     } 

     if(iVsota==20) //You only need to check the digits after sum is calculated 
       printf("Number %d\n", iStevec1); 

    } 

    return 0; 

} 
+0

你不需要start = 100;在for循环中或者不要初始化它。 – SMA 2014-12-06 08:28:32

+0

@almasshaikh我知道!这更多的是来自我的习惯:D但是我希望它能够清楚地表明for循环以100开始并以1000结束(也是我的主要目标是使代码易于阅读并理解正在发生的事情) – Rizier123 2014-12-06 08:29:34

+1

它会如果你能告诉我我做错了什么,那么对我更好......但这也很棒。 – Janac9 2014-12-06 08:33:57

0

下面是一个更广义的方法来获取一个整数所有个体数量的总和(假设正整数):

int getSumOfDigits(int x) 
{ 
    int sum = 0; 
    while (x > 0) 
    { 
     sum += x % 10; 
     x = x/10; 
    } 
    return sum; 
} 

int main() 
{ 
    for (int i = 100; i <= 1000; i++) 
    { 
     if (getSumOfDigits(i) == 20) 
     { 
      printf("%d\n", x); 
     } 
    }  
} 

表达x % 10是整数中的最后一位。因此,这就是我们添加的内容。然后我们把整数中的最后一位数字除以10,重复直到我们达到零。

+0

我已经自己写了这段代码,然后认为用一个计数器替换输入的数字会很棒...谢谢! – Janac9 2014-12-06 08:29:30

+0

反对意见可能是因为这个网站充满了挑剔的人(尽管在这种情况下,即使是挑剔也无法解释它,因为答案本质上是正确的)。但是,它不会回答那些嵌入对自己(或自己)或对整个社区感兴趣的问题的问题。 – 2014-12-06 08:30:55

2

你的循环应该是这样的:

for(iStevec1=100; iStevec1<1000; iStevec1++) 
    { 
     int c2 = iStevec1/100; // extract third digit 
     int c1 = (iStevec1%100)/10; // extract second digit 
     int c0 = (iStevec1%10); // extract first digit 
     if((c0+c1+c2)==20) // sum and verify 
     { 
      printf("%i\n", iStevec1); 
     } 
    } 
0

只需更改1周的事情,你会得到你想要

int main (void) 
    { 
     int iVnos=0; 
     int iOstanek=0; 
     int iVsota=1; 
     int iStevec1=100; 
     int temp; 
     for(iStevec1=100; iStevec1<1000; iStevec1++) 
     { 
      temp = iStevec1; 
      while(temp>0) 
      { 
       iOstanek=temp%100; 
       temp=temp/10; 
       iVsota=iOstanek+iVsota; 
       if(iVsota==20) 
       { 
        printf("%i\n", iStevec1); 
       } 
      } 
     } 
     return(0); 
} 

享受编码享受生活的...

0

替代方法,采取具体的优势。

#include <stdio.h> 
int main() 
{ 
int c0, c1, c2; /* 3 digits sum to 20 */ 
    for(c0 = 2; c0 < 10; c0++){ 
     c1 = 11 - c0; 
     c2 = 9; 
     while(c1 < 10){ 
      printf("%d%d%d\n", c0, c1, c2); 
/* or  printf("%3d\n", (c0*10+c1)*10+c2); */ 
      c1++; 
      c2--; 
     } 
    } 
    return(0); 
} 
相关问题