2017-01-23 59 views
0

我写了这个代码打印所有从1到n的强数字,但根本没有得到输出。运行该程序后终端卡住了,我不知道错在哪里。请纠正我。C程序打印所有从1到n的强数字

145是强一些,因为1! + 4! + 5! == 145

#include <stdio.h> 

void main() { 
    int i = 1, fact, sum, n, a; 
    long int number; 

    printf("\n Find Strong numbers between 1 to \n"); 
    scanf("\n%ld", &number); 

    printf("\n All Strong numbers between 1 to %ld are:\n", number); 

    for (int j = 1; j <= number; j++) { 
     sum = 0; 

     while (j != 0) { 
      a = j % 10; 
      j = j/10; 
      fact = 1; 

      while (i <= a) { 
       fact = fact * a; 
       a--; 
      } 
      sum = sum + fact; 
     } 
     if (j == sum) 
      printf("\n%d\n", j); 
    } 
} 
+0

如果您正在从根本上走错了就是'for'循环通过增加'j'进行迭代,并且第一个内部'while'循环将'j'减少到零。结合起来,这会造成无限循环。这也意味着'j == sum'永远不会是真的,所以不会产生输出。结合起来,这会使代码看起来“卡住” - 程序不断循环,不产生任何输出。最后,'main()'返回'int',而不是'void'。 – Peter

+0

我不相信在'\ n'中使用scanf。 请看这里,如何使用长整数的scanf。 [看这里](http://stackoverflow.com/questions/2852390/using-scanf-in-c-c) – allevo

回答

0

你的代码是停留在一个无限循环比较总和此修正J因您的另一循环内的循环变量的使用。 for循环的变量j在每次迭代中增加1。但是在同样的迭代中,你将j除以10直到它为0.这就是为什么在for循环的每次迭代开始时j总是1。

解决方案是简单地为while循环使用一个额外的变量,并将其初始化为该迭代的j值。请参阅下面的代码来解决这个问题。

void main() 
{ 
    int i=1,fact,sum, n, a, tmp; 
    long int number; 

    printf("\n Find Strong numbers between 1 to \n"); 
    scanf("\n%ld",&number); 

    printf("\n All Strong numbers between 1 to %ld are:\n",number); 

    for(int j=1;j<=number;j++) 
    { 
     tmp = j; 
     sum=0; 

     while(tmp!=0) 
     { 
      a=j%10; 
      tmp=tmp/10; 
      fact=1; 

      while(i<=a) 
      { 
       fact=fact*a; 
       a--; 
      } 
      sum=sum+fact; 
     } 
     if(j==sum) 
      printf("\n%d\n",j); 

    } 
} 
+0

非常感谢。 –

0
j=j/10; 

是影响学家然后,您在

if(j==sum) 
    printf("\n%d\n",j); 
+0

非常感谢,我现在明白了 –

1
#include <stdio.h> 
#include <conio.h> 

void main() { 
    char next_time; 
    int num, fact, n, sum = 0, i, value; 
    next_time = 'y'; 
    while (next_time == 'y' || next_time == 'Y') { 
     printf("Enter a number to check whether a number is strong or not:\t"); 
     scanf("%d", &num); 
     value = num; 

     while (num != 0) { 
      fact = 1; 
      n = num % 10; 
      num = num/10; 
      for (i = 1; i <= n; i++) { 
       fact *= i; 
      } 
      sum += fact; 
     } 
     if (sum == value) 
      printf("%d is strong number", value); 
     else 
      printf("%d is not strong number", value); 

     printf("\n\n******************************"); 
     printf("\n\nDo you want to start again?"); 
     printf("\n\nEnter Y or y to to continue and any other key to exit:\t"); 
     scanf(" %c", &next_time); 
     printf("\n*********************************************\n\n"); 
    } 
    getch(); 
} 

使用增量运算即i++和比较原始号码的总和。

+0

你的程序不回答这个问题:* C程序打印1到n的所有强数字* – chqrlie

0

您的程序失败,因为您修改循环内的循环计数器j以枚举其数字。您也忘记在循环内重新初始化i

下面是一个简单和快速的版本:

#include <stdio.h> 

int main(void) { 
    unsigned long int factorials[10]; 
    unsigned long int number; 

    factorials[0] = 1; 
    for (int i = 1; i < 10; i++) { 
     factorials[i] = factorials[i - 1] * i; 
    } 

    printf("Find Strong numbers from 1 to "); 
    scanf("%lu", &number); 

    printf("\nAll Strong numbers between 1 to %ld are:\n", number); 

    for (unsigned long int j = 1; j <= number; j++) { 
     long int n, sum = 0; 
     for (n = j; n > 9; n /= 10) { 
      sum += factorials[n % 10]; 
     } 
     sum += factorials[n]; 
     if (j == sum) { 
      printf("%ld\n", j); 
     } 
    } 
    return 0; 
} 
0

代码在C找到强大的数字高达10万 OUTPUT

#include<stdio.h> 
int main() { 
    int ino = 0; 
    int newno = 0; 
    int digit = 1; 
    int fact = 1; 
    int i; 
    for(i = 0; i <= 100000; i++) 
    { 
     ino = i; 
     newno = 0; 
     while(ino != 0) 
     { 
      fact = 1; 
      digit = ino % 10; 
      while(digit > 1) 
      { 
       fact *= digit--;    
      } 
      newno += fact; 
      ino /= 10; 
     } 

     if(i == newno) 
     printf("%d, ",i); 
    } 
    printf("\b\b "); 
return 0; 
}