无法让我的程序输出正确的数字。我觉得我犯了一个简单的错误。这是用C语言编写的。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i;
int list[n];
while(1)
{
scanf("%d", &n);
if(n == -1)
{
break;
}
else
{
for(i = 2; i < n; i++)
{
list[i] = list[i-1]+list[i-2];
}
printf("%d %d", i, list[i] );
}
}
}
答案 0 :(得分:2)
(为了简单起见,我将忽略处理输入。)
第一个问题是打开编译器警告。大多数C编译器默认情况下不会给你警告,你必须要求它们。通常通过编译-Wall
。一旦我们这样做,就会揭示出基本问题。
test.c:6:14: warning: variable 'n' is uninitialized when used here [-Wuninitialized]
int list[n];
^
test.c:5:10: note: initialize the variable 'n' to silence this warning
int n, i;
^
= 0
1 warning generated.
int list[n]
会立即创建一个大小为n的列表。由于n
未初始化,因此它将是垃圾。你可以printf("%d\n", n);
看看,它会像1551959272一样。
因此,n
需要初始化,或者您需要动态重新分配list
n
更改。动态分配和重新分配变得复杂,所以让我们把它变成一个静态大小。
所以我们得到了这个。
#include <stdio.h>
#include <stdlib.h>
int main() {
/* Allocate an array of MAX_N integers */
const int MAX_N = 10;
int list[MAX_N];
/* Do Fibonacci */
for(int i = 2; i < MAX_N; i++) {
list[i] = list[i-1]+list[i-2];
}
/* Print each element of the list and its index */
for( int i = 0; i < MAX_N; i++ ) {
printf("%d\n", list[i]);
}
}
运行,但我们只得零(或垃圾)。你的Fibonacci算法有问题。它是f(n) = f(n-1) + f(n-2)
,初始条件为f(0) = 0
和f(1) = 1
。您没有设置这些初始条件。永远不会初始化list
,因此list[0]
和list[1]
将包含该大块内存中的垃圾。
#include <stdio.h>
#include <stdlib.h>
int main() {
/* Allocate an array of MAX_N integers */
const int MAX_N = 10;
int list[MAX_N];
/* Set the initial conditions */
list[0] = 0;
list[1] = 1;
/* Do Fibonacci */
for(int i = 2; i < MAX_N; i++) {
list[i] = list[i-1]+list[i-2];
}
/* Print each element of the list and its index */
for( int i = 0; i < MAX_N; i++ ) {
printf("%d\n", list[i]);
}
}
现在可行。
0 0
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
答案 1 :(得分:0)
主要功能没有返回。
必须先定义n。否则它从内存中获取随机值。 因此,您的列表数组创建的值未知。
int list[n];
此外,这将永远不会发生,因为声明了n,但未定义。
i < n;
这是你需要的吗?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int F[100];
F[0] = 0;
F[1] = 1;
int i = 2;
while(1)
{
if(i < 100)
{
F[i] = F[i-1] + F[i-2];
i++;
}
else
{
break;
}
}
i = 0;
while(1)
{
if(i < 100)
{
printf("%d ; ", F[i]);
i++;
}
else
{
break;
}
}
return 0;
}
答案 2 :(得分:0)
以下是代码段
#include <stdio.h>
int main()
{
int MAX_SIZE = 100; //Initial value
int n, i;
int list[MAX_SIZE];
printf("Enter value of 'n'");
scanf("%d",&n);
if(n < 0){
printf("'n' cannot be negative number");
return 0;
}else if (n==1){
list[0]=0;
}else if(n == 2){
list[0]=0;
list[1]=1;
}else{
list[0]=0;
list[1]=1;
for(i = 2; i <= n; i++)
{
list[i] = list[i-1]+list[i-2];
}
}
//To view array elements
for(int i=0;i<n;i++){
printf("%3d",list[i]);
}
}
答案 3 :(得分:0)
您需要为每次迭代按需分配内存。在你的代码中,n是未经初始化的,这导致了不可遏制的行为。此外,您需要初始化list[0]
和list[1]
,因为这是“基本”案例。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i;
int* list; /* Declare a pointer to the list */
while(1)
{
scanf("%d", &n);
if(n == -1)
{
break;
}
else if ( n > 0 )
{
list = (int *) malloc( n * sizeof(int) );
list[0] = 1;
list[1] = 1;
for(i = 2; i < n; i++)
{
list[i] = list[i-1]+list[i-2];
}
printf("%d %d\n", i, list[i-1] );
free(list);
}
}
}