打印所有在1 - 999之间的阿姆斯特朗号码

时间:2014-04-17 21:45:43

标签: c

如果我想输出如下:

1st Armstrong number = 0
2nd Armstrong number = 1
3rd Armstrong number = 153
.............................................
.............................................
20th Armstrong  number = ....

这里我的问题是:如果我必须打印许多非常强的数字(第1到第20),那么它是逐个编写printf的正确方法吗?然后我需要很多时间&代码将是如此之长,我如何最小化它?

请帮忙......

这是我的代码,能够找到前6个阿姆斯特朗号..

  int main(){
   int a, b, c, num, i=0,j=0;
   printf("Printing all the armstrong numbers between 1 - 999");
   while(i<=999)
   {
    a= i/100;
    a= a*a*a;
    num= i%100;
    b= num/10;
    b= b*b*b;
    c= num%10;
    c=c*c*c;
    if(i==a+b+c)
      {
          j++;
          if(j==1) printf("\n1st");
          else if(j==2) printf("\n2nd");
          else if(j==3) printf("\n3rd");
          else if(j==4) printf("\n4th");
          else if(j==5) printf("\n5th");
          else if(j==6) printf("\n6th");

       printf(" Armstrong number= %d",i);
      }
    i++;
   } // end of while
return 0;
} // end of main

6 个答案:

答案 0 :(得分:1)

很简单:

if(i==a+b+c)
  {
    j++;

    int key = j % 10;

    if(j == 11)
      key = 11;

    switch(key){ 

      case 1:
          printf("\n%dst Armstrong number= %d",j,i);
          break;
      case 2:
          printf("\n%dnd Armstrong number= %d",j,i);
          break;
      case 3:
          printf("\n%drd Armstrong number= %d",j,i);
          break; 
      case 11:   
      default:
          printf("\n%dth Armstrong number= %d",j,i);

  }
}

答案 1 :(得分:1)

似乎序数的规则如下:

x % 10 == 1: *st
x % 10 == 2: *nd
x % 10 == 3: *rd
Otherwise:   *th

让我们用代码写一下:

const char * format = 
    (x % 10 == 1) ? "%dst armstrong number: %d\n" :
    (x % 10 == 2) ? "%dnd armstrong number: %d\n" :
    (x % 10 == 3) ? "%drd armstrong number: %d\n" :
                    "%dth armstrong number: %d\n" ;

printf(format, j, i);

答案 2 :(得分:1)

这是我的解决方案。尽量避免分歧,而不是试图在一个函数中解决它们。我希望这会有所帮助。

#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>

#define CUBE(n) (n*n*n)

char* getCountSuffix(uint16_t n) {
    n %= 100; // We don't care about the hundreds place
    if(n >= 10 && n <= 20) { // 10-19 always use "th" ("tenth", "eleventh", "twelveth", etc.)
        return "th";
    }
    n %= 10;
    switch(n) {
        case 1:
            return "st";
            break;
        case 2:
            return "nd"; // edit: was "nt"
            break;
        case 3:
            return "rd";
            break;
        default:
            return "th";
    }
}

bool isArmstrong(uint16_t n) {
    uint16_t hundreds = n / 100;
    uint16_t tens = (n % 100)/10;
    uint16_t ones = n % 10;

    return (CUBE(hundreds) + CUBE(tens) + CUBE(ones)) == n;
}

int main() {
    size_t i, count;

    for(i = 0, count = 1; i < 1000; i++) {
        if(isArmstrong(i)) {
            printf("%u%s. %u\r\n", count, getCountSuffix(count), i);
            count++;
        }
    }

    return 0;
}

答案 3 :(得分:0)

您找到一个模式并使用该模式。找到一个将罗马数字转换为数字的程序,看看它们是如何提取模式并实现它的。

PS:你正在混淆演示和实施。实现应该计算阿姆斯特朗的数字并且应该将其传递给另一种显示方法,该方法可以跟踪它并以任何方式显示它。显示不是你想在这里解决的问题,我建议不要花太多时间来处理第1,第2,第3个案例。

答案 4 :(得分:0)

使用printf的格式化功能。如果printfs用:

替换所有其他的
printf("\n%dth", j);

整数j将代替%d。如果你需要使用(1st,2nd,3rd,4rth)nd,th和st然后有一些if语句决定使用一个,那么printf使用那个。

答案 5 :(得分:0)

$.each(oggprova.PIANIFI.gennio,function(){....});