2010-12-08 19 views
0
int sum(int number, int min, int counter) 
{ 
    int temp=0, n; 
    n=number+temp; 
    if ((number>=(n/2)) & (number!=min)) 
    { 
     number --; 
     temp ++; 
     while (number>=(n/2)) 
     { 
      cout << number << "+"<< temp << "\n"; 
      number --; 
      temp ++; 
      counter ++; 
     } 
    } 
    else if (number==1) 
    { 
     return counter; 
    } 

    sum(n-1, 1,counter); 
} 

int main() 
{ 
    int number,counter=1; 

    cout << "Please enter the number: "; 
    cin >> number ; 
    cout << "\n"; 

    sum(number, 1, counter); 
    cout << counter; 

    return 0; 
} 

Est-ce que ce dont j'ai besoin mais se bloque et a quelques problèmes avec elle. Je cherche juste quelques conseils sur comment l'améliorer.Problème avec le code C++ pour la théorie des nombres

Je voulais également m'assurer que je pratique correctement la récursivité. Merci!

AJOUTER: Le but du programme est de totaliser le maximum possible de façon à pouvoir additionner un nombre.

Ensuite, le nombre de séquences qui totalisent 6 est 11 (y compris 6 lui-même).

6 
5+1 
4+1+1 
3+1+1+1 
2+1+1+1+1 
1+1+1+1+1+1 
2+2+1+1 
3+2+1 
4+2 
2+2+2 
3+3 

J'essaie aussi de ne pas avoir des séquences qui se répètent, par exemple 2 + 2 + 1 + 1 et 1 + 1 + 2 + 2.

+0

À quoi sert cette fonction? S'il vous plaît fournir plus de détails. –

+0

Vous avez sûrement voulu un logique et ici: 'if ((nombre> = (n/2)) & (nombre! = Min))' – ruslik

+0

@ Hoàng Long: ajouté plus d'informations vérifier. – Zud

Répondre

4

Vous n'avez aucun critère de sortie. Votre fonction va juste recurrse dans les cieux.

+0

A pris soin de cette im maintenant avoir des problèmes avec le compteur – Zud

2

Comme je l'ai commenté plus haut dans la question, votre fonction sum ne retourne pas de valeur à la fin. Un autre problème est que vous passez "compteur" comme une valeur, donc il ne sera pas changé dans votre fonction principale. Vous devez déclarer votre fonction comme ceci:

int sum(int number, int min, int &counter) 

L'opérateur & déterminer que « compteur » est une variable de référence, et peut être modifié en fonction « somme ».

Et comme les commentaires ruslik, vous devez changer l'opérateur & en & &, bien que cela n'affecte pas beaucoup ici.

Vous pouvez jeter un oeil à l'exemple de code here.

+0

Perfect Dumb erreurs de ma part. Un dernier problème. Il renvoie 3 + 1 + 2 comme possibilité mais c'est déjà fait. 3 + 2 + 1 et des idées sur la façon de résoudre ce problème? – Zud

2

Ce lien vous aidera à travers here you go

Code modifié de long pour atteindre Hoàng le résultat souhaité il y a un bug il imprime une combinaison supplémentaire, mais je suis trop paresseux pour le résoudre.

Voici le code

EDIT Correction du bug.

0

Voici une implémentation simple:

void sum_r(int n, int m, int cnt, int* nums){ 
    for (;n >= m; m++) 
     sum_r(n-m, nums[cnt] = m, cnt+1, nums); 
    if (!n) for (int i=0; i<cnt; i++) printf("%d%c",nums[i],(i==cnt-1)?'\n':'+'); 
}; 

void sum(int n){ 
    int nums[100]; 
    return sum_r(n, 1, 0, nums); 
}; 

int main(){ 
    sum(6); 
    return 0; 
}; 
0

S'il vous plaît lire L'art du volume de programmation informatique 4A, Knuth a clairement énuméré de nombreuses méthodes à le faire, par exemple, l'un des plus simple (sans récursivité) est ce,

alt text