【问题标题】:Need help printing Fibonacci sequence in aligned columns需要帮助在对齐的列中打印斐波那契数列
【发布时间】:2018-01-11 17:34:22
【问题描述】:

我目前能够打印序列,但我需要它以特定格式打印。我需要它在列中打印,例如,如果我输入 10 作为输入,则输出应如下所示:

这是我当前的代码:

#include <stdio.h>

int main(int argc, char *args[])
{
  int i, num = 0;
  int n;
  long int f1 =1, f2 = 1;
  if ( argc > 1 ) {
    num = atoi( args[1] );    // convert a number string to an integer
    printf("%d\n", num);      // to test if the it get the argument    

    if (1 <= num && num <= 40) {      
        for(i=1;i<10;i++){
            n = f1 + f2;
            f1 = f2;
            f2 = n;
            printf("%d\n",n);
        }
    }
}
   else
       printf("no argument");

    printf("\n");  
    return 0;
}

【问题讨论】:

  • 请用文字替换文字图片。请解释所需输出格式的规则。 “每行四个数字”也许?你能描述一下你实现的输出和你得到的输出之间的区别吗?您可以通过描述出现不需要的换行符以及缺少所需换行符的位置来做到这一点吗?如果可以的话,它会让你自己解决家庭作业。 meta.stackoverflow.com/questions/334822/…
  • i &lt; 10 在那里做什么,图片显示你想要连续 4 个值
  • 每次打印一个号码都是用"%d\n",所以每次打印号码都会在号码后换行。任何时候你不想换行,不要使用\n

标签: c fibonacci


【解决方案1】:

(这似乎是一个家庭作业,所以我将根据此处描述的折衷方案来回答 How do I ask and answer homework questions? 。也就是说,我不会提供完整的代码解决方案。相反,我会帮助您以一种允许的方式思考你自己做作业,给出提示。)

第一个提示:

  • 描述您实现的输出。
  • 描述所需的输出。
  • 通过指定不需要的换行符的位置以及缺少所需换行符的位置来执行此操作。

第二个提示:

  • 您需要记住表示数字所需的位数
  • 使用这些知识来获得对齐,例如2 和 13 对
  • 为此,您需要(在开始打印之前)就列的宽度提出意见

第三条提示:

  • 使用\t 进行对齐似乎是一个很有前景的概念
  • 但对于具有一定位数的数字,环境特别注定会失败
  • 8 位及以上的数字是制表符对齐的问题
    (至少在您的环境中,在其他环境中可能已经失败,例如 4 位数),
    找到原因
  • 找到一种不同的方法来引入适当数量的前导空格,具体取决于要打印的数字的宽度

让我知道这有多大帮助,我可能会提供更多提示。

【讨论】:

  • ya 下面提供的答案一直有效,直到数字变大,就像输入为 40 一样。我现在正试图弄清楚
  • 好的,除了一个问题,我已经解决了所有问题,如果数字是 8 位或更多,则间距不正确。我认为这是由于 if 语句每 4 位创建空间,因此当它达到 8 位时,它会创建两倍所需的空间。仍在努力解决此问题
  • 您指的是 cleblanc 的答案中的 if 吗?
  • 是的,特别是这部分代码 if (++i%4==0){ printf("\n"); }
  • 对于 8 位数字,问题不能来自 if (++i%4==0) printf("\n"); 行,\t 的短视使用是罪魁祸首。请尝试找出并描述原因。
【解决方案2】:

这看起来有点像家庭作业,所以我认为没有人应该你答案。话虽如此,您可能想查看modulus operator。提示:每次num % something 等于0 时,您可能需要插入一个换行符。

您还想查看sprintfprintf。例如,尝试 "%20d""%-20d"

祝你好运!

编辑: 好像有人给了你答案。您应该真正了解为什么它可能满足也可能不满足您的需求。此外,使用标签 ("\t") 可能会也可能不会满足您(或您的请求者)的要求。如果列的间距很重要,您可能想回顾一下我的回答。

【讨论】:

  • 你提供的答案一直有效,直到数字变大,就像输入为 40 一样。我现在正试图弄清楚
【解决方案3】:

你可以试试这样的;

使用制表符分隔大多数数字,并每隔四位打印一个换行符,并在 for 循环终止条件中使用 num 而不是 10。

if (1 <= num && num <= 40) {
    /* Add this to print the first two fibinacci values */
    printf("\t1\t1");        
    for(i=2;i<num;){
        n = f1 + f2;
        f1 = f2;
        f2 = n;
        printf("\t%d",n);
        /* Once we've printed 4 digits print a newline */
        if (++i%4==0)
            printf("\n");

    }
}

【讨论】:

    【解决方案4】:

    我认为你可以玩它。

    printf(i % 4 == 0 ? "\t%d\t\n" : "\t%d\t", n);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 2015-01-04
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      相关资源
      最近更新 更多