【问题标题】:Print the power of 10 - Printf in C打印 10 的幂 - C 中的 Printf
【发布时间】:2018-11-06 18:48:25
【问题描述】:

我必须打印 0-19 范围内的 10 的幂。问题是当我想显示第一个幂时,应该是 1 (10^0),我不能强制 printf 不重复任何 0。我只能在我的程序中使用一个printf 和一个{ } 块(这是主要功能)。

#include <stdio.h>

int main(void) {
    int power = 19;
    for (int i = 0; i <= power; i++)
        printf("1%0*d\n",i, 0);
    return 0;
}

我的输出:

10 // this should be 1, but printf still puts 0 here
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
10000000000
100000000000
1000000000000
10000000000000
100000000000000
1000000000000000
10000000000000000
100000000000000000
1000000000000000000
10000000000000000000

【问题讨论】:

    标签: c printing printf


    【解决方案1】:

    不要使用%d,而是使用具有可变精度的%s,并让它从一串零打印。如果精度为 0,则不打印任何字符。

    #include <stdio.h>
    
    int main(void) {
        int power = 19;
        char zeros[] = "00000000000000000000";
        for (int i = 0; i <= power; i++)
            printf("1%.*s\n",i, zeros);
        return 0;
    }
    

    【讨论】:

    • 哦,我明白了,所以它只需要 char 的一定范围。真聪明,谢谢。
    【解决方案2】:

    您可以像这样达到预期的效果:

    #include <stdio.h>
    
    int main(void) {
        unsigned long long power = 1;
        for (int i = 0; i <= 19; i++, power *= 10)
            printf("%llu\n", power);
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      正如@Weather Vane 所评论的,使用unsigned long long 可以处理至少18,446,744,073,709,551,615 或264 - 1.

      int main(void) {
        unsigned long long power = 0;
        for (int i = 0; i <= 19; i++)
          printf("%d %llu\n", i, power = power ? power*10 : 1);
        return 0;
      }
      

      输出

      0 1
      1 10
      2 100
      ...
      17 100000000000000000
      18 1000000000000000000
      19 10000000000000000000
      

      或者,如果您不喜欢像"00000000000000000000" 这样对初始化刺痛进行硬编码,请在同一个循环中分配元素。

      注意"%.*s" 可以打印一个非空字符 终止的char 数组。

      #define MAX10POWER 30
      
      int main(void) {
        char zeros[MAX10POWER];
        for (int i = 0; i <= MAX10POWER; zeros[i++] = '0')
          printf("%d 1%.*s\n", i, i, zeros);
        return 0;
      }
      

      输出

      0 1
      1 10
      2 100
      ...
      28 10000000000000000000000000000
      29 100000000000000000000000000000
      30 1000000000000000000000000000000
      

      或者Weather Vane 的一个偷偷变种的好答案可以达到 21。

      int main(void) {
        for (unsigned long long power = 1, i = 0; i <= 21; i++, power *= 8)
          printf("%lld %llo\n", i, power);
      }
      

      【讨论】:

      • OP 的要求是一对大括号,main 的主体 :(
      • @WeatherVane 返回一组{}
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      相关资源
      最近更新 更多