2017-09-22 3 views
4

Comment puis-je modifier le programme suivant, afin qu'il effectue la même tâche, mais en utilisant uniquement des ajouts et des affectations?Comment effectuer une multiplication en utilisant uniquement des ajouts et des affectations?

Je peux seulement faire 27 ajouts maximum, et la sortie doit être générée dans une seule entrée. boucles et autres opérations de contrôle de flux sont non autorisés

#include <iostream> 

int main() 
{ 
    int a; 
    std::cout << "Enter number: "; 
    std::cin >> a; 

    std::cout << a*29 << std::endl; 

    return 0; 
} 
+2

Ce n'est pas C++ question. C'est une question mathématique –

+4

S'il vous plaît, donnez toutes les restrictions tout de suite. La dernière édition que vous avez faite a juste invalidé quelques réponses sur lesquelles les gens ont passé du temps! J'ai raison de répondre, mais je crains que vous ne changiez les règles une fois de plus. Je vote pour clore la question. – YSC

+0

Utiliser la récursivité. Voir par exemple [cette question en double] (https://stackoverflow.com/questions/19897824/c-recursively-multiply-2-integers-using-addition) et [celui-ci aussi] (https://stackoverflow.com/questions/20289063/comment-multiplier-utiliser-addition). –

Répondre

0

, plus resRepetitive est la multiplication - mathématiquement

répéter donc plus de a pour n nombre de fois. Une boucle for/while simple peut faire

#include <iostream> 

int main() 
{ 
    int a,i,temp=0; 
    std::cout << "Enter number: "; 
    std::cin >> a; 
    for(i=1;i<=29;i++) 
     temp+=a;//add a repeatedly for 'n' number of times. Here 29 as per your requirement. a*n 
    std::cout << temp <<std::endl; 
    return 0; 
} 

Sans boucle

int b=0,result=0; 
b=a+a+a+a+a+a+a;\\adding for 7 times 
result=b+b+b+b+a;\\4 times 7 (of a)= 28+a= 29 times (of a). 

Cela implique 10 addition.

+0

cela n'aide pas OP, d'où mon downvote – YSC

1

La multiplication est juste un ajout répété. Utilisez une boucle pour cela. Savez-vous combien de fois votre boucle devrait s'exécuter? Oui! Donc, utilisez une boucle for.

Voici donc le plan:

  1. Obtenez entrée
  2. Utilisez une boucle pour effectuer l'addition
  3. sortie sum

Exemple:

// get input 
int input; 
std::cout << "Enter number: "; 
std::cin >> input; 

// use a for loop to perform the addition 
int sum = 0; 
for(int i = 0; i< 29; ++i) 
    sum += a; 

// output result 
std::cout << sum << std::endl; 
+2

Lisez-le de plus près. Les boucles et les opérations de flux de contrôle ne sont pas autorisées – Coke

-1
Vous

peut ajouter une valeur multiple fois:

int sum=0; 
for(int i=0; i<multipler; i++){ 
    sum+=a; //adds value of a to itself 
} 
return sum; 

Si vous souhaitez plusieurs que par 2, vous pouvez simplement décalage vers la gauche:

a = a << 1; 
+3

"Les boucles et autres opérations de flux de contrôle ne sont pas autorisées" – harold

+0

Si le multiplicateur est connu, vous pouvez faire quelque chose comme ceci (pour 29): 'output = a << 4; // * 16 sortie + = a << 3; // * 8 sortie + = a << 2; // * 4 sortie + = a; // * 1' – UncleStalin

0

Si vous n'êtes autorisé à utiliser + et =, et ne sont pas autorisés à tricher en introduisant d'autres les variables, il n'y a aucun moyen de le faire, sauf si vous vous livrez à un peu un comportement non défini et de vous permettre quelque chose de la forme

... + (a += ...) + ... 

... est un nombre quelconque de a +. L'astuce ici est que (a += ...) change la valeur de a à mi-chemin de l'évaluation de l'expression.

Tempting comme il peut être, hélas! C'est pas C++ portable depuis += et + ne sont pas des points de séquençage. Sur votre compilateur de classe, vous pourriez être capable de faire fonctionner ceci.

Voir https://ideone.com/fC3fai, vous pouvez voir que

(a + a + a + a + a + (a += a + a + a) + a + a + a + a + a) 

fait le travail sur ce particulier compilateur (au moment de l'écriture). (Pour ce que ça vaut, il fait aussi la bonne chose en Java où l'expression est bien définie).

+0

vous pouvez multiplier par 32 ('<< 5') puis soustraire trois fois;) – YSC

+0

@YSC: En effet, j'ai pris cela pour signifier juste' + 'et' = ', pressant dans' + = '. – Bathsheba

+0

vous pouvez également utiliser récursion – YSC

2

De cette façon, vous pouvez le faire avec 21 ajouts.

#include <iostream> 

int main() 
{ 
    int a; 
    std::cout << "Enter number: "; 
    std::cin >> a; 
    int b = (a+a+...+a) // 10 times 
    b = b + b; 
    b = b + (a + a + a ... + a); // 9 times 
    std::cout << b << std::endl; 

    return 0; 
} 
6

Ce n'est pas général, et il ne peut pas être, mais il suffit de multiplier par 29, vous pouvez le faire:

// x is input 
int t = x; // x*1 
x = x + x; 
x = x + x; 
t = t + x; // x*5 
x = x + x; 
t = t + x; // x*13 
x = x + x; 
t = t + x; // x*29 

Ceci est juste déroula la multiplication binaire, comme les réponses similaires, mais sans nommer les résultats temporaires. Les additions à t correspondent aux bits mis en 29.

7

Une autre approche qui nécessite 7 +:

int M1 = a;  // 1a 
int M2 = M1 + M1; // 2a 
int M4 = M2 + M2; // 4a 
int M8 = M4 + M4; // 8a 
int M16 = M8 + M8; // 16a 
int res = M16 + M8 + M4 + M1; // 29a 

Le résultat est construit à partir de la configuration binaire du multiplicateur, à savoir 29 décimal est 0001,1101 binaire. Nous devons donc ajouter M16, M8, M4 et M1 (et exclure M2).

+0

Oui, cela pourrait bien être ce que l'enseignant veut. Une manière d'enseigner binaire? – Bathsheba

+0

@Bathsheba qui doit être un _terrible_ teacher oO – YSC

+1

Je pense que c'est une façon d'introduire la récursivité et les arbres. "No Loops" est le cadeau. – duffymo

2

Pouvez-vous utiliser un var supplémentaire?

b = a + a + a//3 times a 
b = b + b + b//9 times a 
b = b + b + b//27 times a 
b = b + a + a//29 times a 
0

Vous pouvez essayer cette -

b = a + a + a + a + a + a + a + a + a + a + a + a + a + a + a; // equivalent to a*15 

b += b -a;