打印系列时遇到问题
Having trouble printing a series
这是我应该做的问题陈述:
- 编写一个程序来打印以下序列,直到用户输入的术语为止。
0, 1, 1, 2, 3, 5, 8, 13, ….
其中 0 是第 1 项,13 是第 8 项。
提示:0、1
0+1 = 1
0, 1, 1
1+1 = 2
0, 1, 1, 2
这是我的代码:
int prev_i = 0;
cout << "Enter a number: " << endl;
cin >> number;
for (i = 0; i <= number; i++)
{
cout << prev_i + i << " ,";
prev_i = i;
}
虽然我确实知道我的代码有什么问题。它将 i 添加到 prev_i 然后 prev_i 被设置为 i。因此,在下一次迭代中,当 i 为 1 时,即 i + prev_i = 1,所以现在 prev_i = 1,这就是问题所在,我现在为 2,所以 i + prev_i = 3。我真的似乎无法弄清楚如何在这里输出 1 而不是 3 等等。
哦,别担心我没有正确申报。我只是没有复制那部分。
请帮忙!
显示的系列是fibonacci sequence。
查看它的定义并找出:您需要哪些数字来计算当前数字?
在您当前的代码中,您只有一个以前的号码可用。
如果这还不够,您还需要什么?
您正在尝试生成一个斐波那契数列(以两项 (0,1) 开头,每个后续项都是前两项的加法)。因此,i
不应该是计算的一部分;它只是用来控制循环。
序列中前十个数字的简单生成就是这样:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=0, b=1;
for (int i=0; i<10; ++i)
{
printf("%d ", a);
int c = a+b;
a = b;
b = c;
}
fputc('\n', stdout);
return EXIT_SUCCESS;
}
就是这样。上面的代码将生成以下内容:
0 1 1 2 3 5 8 13 21 34
我保留应用上述逻辑来生成您最终要求的任何内容,但这就是迭代生成序列的方式。
PS:写C代码提前致歉。我完全隔开了语言标签,但算法是一样的。
这是我的三分钱。:)
#include <iostream>
#include <utility>
int main()
{
while (true)
{
std::cout << "Enter a non-negative number (0 - exit): ";
unsigned int n;
if (!( std::cin >> n ) || ( n == 0 )) break;
unsigned long long int first = 0;
unsigned long long int second = 1;
std::cout << '\n';
for (unsigned int i = 0; i < n; i++)
{
if (i != 0) std::cout << ' ';
std::cout << first;
second += std::exchange( first, second );
}
std::cout << "\n\n";
}
}
程序输出可能看起来像
Enter a non-negative number (0 - exit): 1
0
Enter a non-negative number (0 - exit): 2
0 1
Enter a non-negative number (0 - exit): 3
0 1 1
Enter a non-negative number (0 - exit): 4
0 1 1 2
Enter a non-negative number (0 - exit): 5
0 1 1 2 3
Enter a non-negative number (0 - exit): 6
0 1 1 2 3 5
Enter a non-negative number (0 - exit): 7
0 1 1 2 3 5 8
Enter a non-negative number (0 - exit): 8
0 1 1 2 3 5 8 13
Enter a non-negative number (0 - exit): 0
斐波那契数增长非常快。所以一般需要检查for循环是否会溢出
您的代码正在打印当前元素和前一个元素的总和。但是上面的问题要求斐波那契数被定义为:
Fib[i] = Fib[i - 1] + Fib[i - 2]; Fib[0] = 0, Fib[1] = 1
现在可以通过递归或者一维DP来解决
但是知道上面的关系就可以构造一个简单的解。我们可以定义当前的斐波那契数是前一个和前一个的总和。
密码是:
int prev1 = 0; // Fib[0]
int prev2 = 1; // Fib[1]
int curr;
cout << prev1 << ' ' << prev2 << ' ';
for (int i = 2; i <= n; i++)
{
// Fib[i] = Fib[i - 1] + Fib[i - 2];
curr = prev2 + prev1;
cout << curr << ' ';
prev1 = prev2;
prev2 = curr;
}
这是我应该做的问题陈述:
- 编写一个程序来打印以下序列,直到用户输入的术语为止。 0, 1, 1, 2, 3, 5, 8, 13, …. 其中 0 是第 1 项,13 是第 8 项。 提示:0、1 0+1 = 1 0, 1, 1 1+1 = 2 0, 1, 1, 2
这是我的代码:
int prev_i = 0;
cout << "Enter a number: " << endl;
cin >> number;
for (i = 0; i <= number; i++)
{
cout << prev_i + i << " ,";
prev_i = i;
}
虽然我确实知道我的代码有什么问题。它将 i 添加到 prev_i 然后 prev_i 被设置为 i。因此,在下一次迭代中,当 i 为 1 时,即 i + prev_i = 1,所以现在 prev_i = 1,这就是问题所在,我现在为 2,所以 i + prev_i = 3。我真的似乎无法弄清楚如何在这里输出 1 而不是 3 等等。
哦,别担心我没有正确申报。我只是没有复制那部分。
请帮忙!
显示的系列是fibonacci sequence。 查看它的定义并找出:您需要哪些数字来计算当前数字? 在您当前的代码中,您只有一个以前的号码可用。 如果这还不够,您还需要什么?
您正在尝试生成一个斐波那契数列(以两项 (0,1) 开头,每个后续项都是前两项的加法)。因此,i
不应该是计算的一部分;它只是用来控制循环。
序列中前十个数字的简单生成就是这样:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=0, b=1;
for (int i=0; i<10; ++i)
{
printf("%d ", a);
int c = a+b;
a = b;
b = c;
}
fputc('\n', stdout);
return EXIT_SUCCESS;
}
就是这样。上面的代码将生成以下内容:
0 1 1 2 3 5 8 13 21 34
我保留应用上述逻辑来生成您最终要求的任何内容,但这就是迭代生成序列的方式。
PS:写C代码提前致歉。我完全隔开了语言标签,但算法是一样的。
这是我的三分钱。:)
#include <iostream>
#include <utility>
int main()
{
while (true)
{
std::cout << "Enter a non-negative number (0 - exit): ";
unsigned int n;
if (!( std::cin >> n ) || ( n == 0 )) break;
unsigned long long int first = 0;
unsigned long long int second = 1;
std::cout << '\n';
for (unsigned int i = 0; i < n; i++)
{
if (i != 0) std::cout << ' ';
std::cout << first;
second += std::exchange( first, second );
}
std::cout << "\n\n";
}
}
程序输出可能看起来像
Enter a non-negative number (0 - exit): 1
0
Enter a non-negative number (0 - exit): 2
0 1
Enter a non-negative number (0 - exit): 3
0 1 1
Enter a non-negative number (0 - exit): 4
0 1 1 2
Enter a non-negative number (0 - exit): 5
0 1 1 2 3
Enter a non-negative number (0 - exit): 6
0 1 1 2 3 5
Enter a non-negative number (0 - exit): 7
0 1 1 2 3 5 8
Enter a non-negative number (0 - exit): 8
0 1 1 2 3 5 8 13
Enter a non-negative number (0 - exit): 0
斐波那契数增长非常快。所以一般需要检查for循环是否会溢出
您的代码正在打印当前元素和前一个元素的总和。但是上面的问题要求斐波那契数被定义为:
Fib[i] = Fib[i - 1] + Fib[i - 2]; Fib[0] = 0, Fib[1] = 1
现在可以通过递归或者一维DP来解决
但是知道上面的关系就可以构造一个简单的解。我们可以定义当前的斐波那契数是前一个和前一个的总和。
密码是:
int prev1 = 0; // Fib[0]
int prev2 = 1; // Fib[1]
int curr;
cout << prev1 << ' ' << prev2 << ' ';
for (int i = 2; i <= n; i++)
{
// Fib[i] = Fib[i - 1] + Fib[i - 2];
curr = prev2 + prev1;
cout << curr << ' ';
prev1 = prev2;
prev2 = curr;
}