【问题标题】:Spacing fibonacci chart corresponding to the length of fibonacci numbers in C间距斐波那契图表对应于 C 中斐波那契数的长度
【发布时间】:2014-12-24 00:00:44
【问题描述】:

在表格中,n 值应该与带有空格的值 fibo 的行相吻合。

printf("n | ");  

for (i = 1; i < = n ; i++)
{
    printf("%d", i);

    for (wert=0; wert < = (hochn(fibo(i)) - hochn(i)) ; wert++)
    {
        printf(" ");
    }
}

其他函数 'hochn' 求 10 次方的值。

int hochn (int b)
{
    int tmp;

    for(tmp =0; b > 10 ; tmp++)
    {
        b = (b / 10); 
    }

    return tmp;
}

此外,'fibo' 找到斐波那契数的值。

程序的实际运行如下:

n | 1 2 3 4 5 6 7  8  9  10  11 12  13  14  
--------------------------------------------
f | 1 1 2 3 5 8 13 21 34 55 89 144 233 377

为什么n=11只有1个空格,n=12又回到2个空格?

【问题讨论】:

  • 您好,欢迎来到 StackOverflow!你有没有试过先调试你的代码,看看能不能找到答案?
  • b &gt; 10 --> b &gt;= 10。还有&lt; = --> &lt;=
  • 使用printf(" "); 代替putchar(' '); 是有效的,但有点笨拙。输出是这样的,因为hochn() 产生了错误的答案。例如:0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 1, 12: 1, 13: 1, … 97: 1, 98: 1, 99: 1, 100: 1, 101: 1, 102: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1, 109: 1, 110: 2, 111: 2, …。这很容易通过运行一个从 0 到 120 或其他计数的简单测试来显示。修复它使其适用于 0 以及更大的数字是微妙的:for (tmp = 1; (b /= 10) &gt; 0; tmp++) ; 有效。了解如何测试琐碎的代码。

标签: c space fibonacci


【解决方案1】:

问题是对hochn() 函数返回的值的简单测试表明它产生了错误的答案。在下面的代码中,您的版本是hochn0();固定版本是hochn1()。我也包含了布局的测试代码。请注意,标题行的打印在数字之后而不是之前放置空格,这也使事情变得复杂,并在行尾留下尾随空格。您可能还会注意到,您的问题是从 7 而不是 11 开始的。

在下面的代码中,我将函数设为静态,因为我使用的编译器选项要求在定义函数之前声明函数。

#include <stdio.h>

static int hochn0(int b)
{
    int tmp;

    for (tmp = 0; b > 10; tmp++)
        b = (b / 10);

    return tmp;
}

/* hochn1() - return int(log10(b)) - 1, and 0 for b <= 0 */
static int hochn1(int b)
{
    int tmp;

    for (tmp = 0; (b /= 10) > 0; tmp++)
        ;

    return tmp;
}

static int fibo(int n)
{
    int f0 = 0;
    int f1 = 1;
    for (int i = 0; i < n - 1; i++)
    {
        int fn = f0 + f1;
        f0 = f1;
        f1 = fn;
    }
    return f1;
}

int main(void)
{
    for (int i = 0; i < 120; i++)
    {
        int h0 = hochn0(i);
        int h1 = hochn1(i);
        if (h0 != h1)
            printf("%3d: hochn0 = %d, hochn1 = %d\n", i, hochn0(i), hochn1(i));
    }

    int n = 14;

    /* Broken - print spaces after number */
    printf("n | ");
    for (int i = 1; i <= n; i++)
    {
        printf("%d", i);
        for (int wert = 0; wert <= (hochn0(fibo(i)) - hochn0(i)); wert++)
            putchar(' ');
    }
    putchar('\n');

    /* Fixed - print spaces before number */
    printf("n |");
    for (int i = 1; i <= n; i++)
    {
        for (int wert = 0; wert <= (hochn1(fibo(i)) - hochn1(i)); wert++)
            putchar(' ');
        printf("%d", i);
    }
    putchar('\n');

    /* Succinct fixed */
    int count = 0;
    count += printf("n |");
    for (int i = 1; i <= n; i++)
        count += printf("%*s%d", (hochn1(fibo(i)) - hochn1(i)) + 1, " ", i);
    putchar('\n');

    for (int i = 0; i < count; i++)
        putchar('-');
    putchar('\n');

    /* Result line */
    printf("f |");
    for (int i = 1; i <= n; i++)
        printf(" %d", fibo(i));
    putchar('\n');

    return 0;
}

示例输出:

第一部分确定hochn0()hochn1() 产生不同答案的数字。最后几行显示了输出在原始版本和几个修订版本中的显示方式。

 10: hochn0 = 0, hochn1 = 1
100: hochn0 = 1, hochn1 = 2
101: hochn0 = 1, hochn1 = 2
102: hochn0 = 1, hochn1 = 2
103: hochn0 = 1, hochn1 = 2
104: hochn0 = 1, hochn1 = 2
105: hochn0 = 1, hochn1 = 2
106: hochn0 = 1, hochn1 = 2
107: hochn0 = 1, hochn1 = 2
108: hochn0 = 1, hochn1 = 2
109: hochn0 = 1, hochn1 = 2
n | 1 2 3 4 5 6 7  8  9  10  11 12  13  14  
n | 1 2 3 4 5 6  7  8  9 10 11  12  13  14
n | 1 2 3 4 5 6  7  8  9 10 11  12  13  14
------------------------------------------
f | 1 1 2 3 5 8 13 21 34 55 89 144 233 377

【讨论】:

    猜你喜欢
    • 2016-08-09
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2015-06-05
    • 2014-05-23
    • 2014-05-03
    • 1970-01-01
    相关资源
    最近更新 更多