2012-01-10 3 views
-4

J'utilise Dev-C++. Il ne montre aucune erreur de code, mais ne fonctionne pas.Le programme simple ne compile pas

Il fonctionne lorsque je tente un petit nombre comme 10 ou 20

Je travaille sur ce problème:

Chaque nouveau terme dans la séquence de Fibonacci est généré en ajoutant les deux termes précédents. En commençant par 1 et 2, les 10 premiers termes seront être:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

En considérant les conditions dans la séquence de Fibonacci dont les valeurs ne dépassent pas quatre millions, trouvez la somme des termes pairs.

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
const int N=100; 
int a=1,b=2,i,t[N],S=0,c,j; 
t[0]=1; 
t[1]=2; 
for(i=2;i<N;i++){ 
t[i]=t[i-2]+t[i-1]; 
if(t[i]>4000000) 
{ 
for(j=1;j<=i-1;j++){ 
        c=t[j]%2; 
        if(c==0){ 
          S=S+t[j]; 
          } 
        else { 
          continue; 
        }} 
break; 
} 
} 
printf("%d\n",S); 
system("pause"); 
} 
+5

S'il vous plaît ne vous une faveur et d'améliorer l'empreinte et l'utilisation des espaces et nommage des variables. De même, vous n'utilisez rien de déclaré dans '', donC#include n'est que du spam. – pmg

+0

Quelle est la sortie? Qu'attendez-vous? – eduffy

+4

N'utilisez pas Dev-C++! C'est un projet mort depuis très longtemps et livré avec un ancien compilateur. – ThiefMaster

Répondre

1

Vous n'avez pas besoin d'un tableau pour stocker tous ces nombres, vous pouvez vous en sortir en stockant les deux derniers termes de la séquence, puisque c'est tout ce dont vous avez besoin pour calculer le prochain terme.

Lorsque vous essayez d'allouer autant d'espace sur la pile, vous demandez des problèmes car la pile est une ressource relativement limitée.

En fait, ce code exact entré dans gcc sur une machine Linux me donne une violation de segmentation quand j'essaye de l'exécuter, précisément pour cette raison.

En plus de cela, votre code est pas obtenir les termes même valeur, il se fait chaque terme, et vous obtenez les premiers quatre millions de valeurs, plutôt que les valeurs inférieures à quatre millions qui a été spécifié.

Le genre de code que vous êtes après ressemblera à ceci:

#include <stdio.h> 

int main (void) { 
    // Accumulator and terms (acc is zero because first two terms are odd). 

    int acc = 0, t1 = 1, t2 = 1, t3; 

    // Continue until next term is 4mil or more. 

    while ((t3 = t1 + t2) < 4000000) { 
     // printf ("DEBUG: %d %d %d %s\n", t1, t2, t3, 
     //  ((t3 % 2) == 0) ? "<<" : ""); 

     // Accumulate only even terms. 

     if ((t3 % 2) == 0) acc += t3; 

     // Cycle through terms. 

     t1 = t2; t2 = t3; 
    } 

    // Print the accumulated value. 

    printf ("%d\n", acc); 

    return 0; 
} 

Et la sortie:

4613732 

Si vous testez ce programme en décochant commentant la déclaration de débogage, vous voyez :

DEBUG: 1 1 2 << 
DEBUG: 1 2 3 
DEBUG: 2 3 5 
DEBUG: 3 5 8 << 
DEBUG: 5 8 13 
DEBUG: 8 13 21 
DEBUG: 13 21 34 << 
DEBUG: 21 34 55 
DEBUG: 34 55 89 
DEBUG: 55 89 144 << 
DEBUG: 89 144 233 
DEBUG: 144 233 377 
DEBUG: 233 377 610 << 
DEBUG: 377 610 987 
DEBUG: 610 987 1597 
DEBUG: 987 1597 2584 << 
DEBUG: 1597 2584 4181 
DEBUG: 2584 4181 6765 
DEBUG: 4181 6765 10946 << 
DEBUG: 6765 10946 17711 
DEBUG: 10946 17711 28657 
DEBUG: 17711 28657 46368 << 
DEBUG: 28657 46368 75025 
DEBUG: 46368 75025 121393 
DEBUG: 75025 121393 196418 << 
DEBUG: 121393 196418 317811 
DEBUG: 196418 317811 514229 
DEBUG: 317811 514229 832040 << 
DEBUG: 514229 832040 1346269 
DEBUG: 832040 1346269 2178309 
DEBUG: 1346269 2178309 3524578 << 
4613732 

et, si vous additionnez tous les numéros pairs à la fin de ces lignes DEBUG, vous avez en effet la valeur donnée.

0

Deux choses que je remarquais que sont main ne dispose pas d'un type de retour (essayez int main()) et N est utilisé comme une taille de tableau, mais n'est pas constante.

2

Vous ne pouvez pas définir un tableau de taille variable (T [N]). Si vous faites N const, le problème devrait être résolu.

const int N = 3999998; 
int T(N); 

De même, main devrait avoir un type de retour. Passez à "int main()"?

+0

Non en C, mais, apparemment, l'OP essaye d'écrire un multi -language fichier source :) – pmg

+0

Err, c99 permet VLA sans une expression const. – paxdiablo

+0

@paxdiablo: Oui, vous avez raison! Je pense que Lindydancer a bien compris. – nijoakim

0

Il s'agit d'une erreur de programmation très courante appelée "Stack overflow". En fait, il est si commun qu'il a nommé un site de questions et réponses très populaire, "Stack Overflow", peut-être en avez-vous entendu parler?

(je l'ai attendu pour être en mesure de donner cette réponse jamais depuis mon arrivée « Stack Overflow » !!!)

+0

Remarque: Cette réponse a été donnée en réponse à une version antérieure de la question, où le code fourni allouait un tableau de 3999998 'int': s. – Lindydancer