C for schleife multiplikation

Neue Frage »

Auf diesen Beitrag antworten »
0664jester C for schleife multiplikation

hallo,

ich versuche hier eine additon zu schreiben:

Ich moechte eine multiplikation per hand durch fuehren.

123*456


dazu muss ich 6 mit 123, 5 mit 123 und 4 mit 123 mulitplitzieren und dann
die ergebnisse zwischenspeichern, die ich dann shiften muss und addieren.

int b2 = b / 100;
int b1 = (b % 100)/10;
int b0 = b % 10;


for (int i=0; i<3, i++)


wie kann ich das in eine schleife packen, sodass b0, b1, b2 mit a jeweils multiplitziert wird.
mein problem liegt daran, dass ich jetzt nicht weiss, wie wie am besten auf b0 b1 b2 zugreifen soll?
 
Auf diesen Beitrag antworten »
Karlito

Hallo 0644jester,

entschuldige bitte die fehlende Hilfe zur Selbsthilfe. Ich hoffe ich habe dein Anliegen richtig verstanden:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv){
	int a = 123;
	int b = 456;
	int result = 0;

	while(a!=0){
		result += b * (a % 10);
		b*=10;
		a/=10;
	}
	
	printf("%d\n", result);

	return 0;
}


Solltest Du Fragen dazu haben, gib bitte Bescheid.

VG,

Karlito
Auf diesen Beitrag antworten »
as_string

Hallo,

Karlito hat natürlich Recht, dass man die einzelnen Ziffern ja nicht unbedingt in Variablen zwischenspeichern muss, sondern auch gleich die errechneten verwenden kann.

Allgemein bietet sich aber immer ein Array an, wenn man auf mehrere Variablen auf gleiche Art und Weise zugreifen will. Z. B. das hier:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
#include "stdio.h"

int main() {
        int a = 123;
        int b = 456;

        int b_digits[12];

        int b_high = b;

        int i;

        for(i = 0; i < (sizeof(b_digits)/sizeof(b_digits[0])); i++) {
                b_digits[i] = b_high % 10;
                b_high /= 10;
        }

        for(i = 0; i < (sizeof(b_digits)/sizeof(b_digits[0])); i++) {
                printf("b_digits[%2d] = %d\n", i, b_digits[i]);
        }
        return 0;
}


Hat diese Ausgabe:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
b_digits[ 0] = 6
b_digits[ 1] = 5
b_digits[ 2] = 4
b_digits[ 3] = 0
b_digits[ 4] = 0
b_digits[ 5] = 0
b_digits[ 6] = 0
b_digits[ 7] = 0
b_digits[ 8] = 0
b_digits[ 9] = 0
b_digits[10] = 0
b_digits[11] = 0


Gruß
Marco
Auf diesen Beitrag antworten »
0664jester

hi,

danke für die Antworten,
mir wurde gestern mitgeteilt dass ich nur additionen und subtraktionen verwenden darf...

bei 3 stelligen Zahlen gibt es eine Schleife, welche 3 mal durchlaufen ist.
* Bei jedem Schleifedurchlauf wird ein Partialprodukt ermittelt und zum Produkt addiert.
* Fuer jedes Partialprodukt braucht man den wert von a, welcher Stelle fuer Stelle
* nach links verschoben wird.
* Und man muss in jedem Schleifendurchlauf das niederwertigste Bit von b betrachten und sodann b um eine
* eine Stelle nach rechts verschieben.



lg
 
Auf diesen Beitrag antworten »
0664jester

wie spalte ich a*b mod c am besten auf?
Auf diesen Beitrag antworten »
as_string

Hallo,

also irgendwie verstehe ich jetzt gar nicht mehr, was Du genau machen willst/musst.
Erst redest Du von drei Stellen, über die Du iterieren willst. Nach Deinen ersteren Beispielen sollten das wohl Dezimalstellen sein, oder?
Dann redest Du aber von Bit und "Stelle für Stelle nach links verschieben" und so, ohne Multiplikation zu verwenden, was mir alles danach klingt, als ob es im Binär-System gemacht werden soll.

Kannst Du nicht mal die Aufgabenstellung wörtlich hier rein stellen, damit wir wissen, was genau überhaupt Sache ist...

Gruß
Marco
Auf diesen Beitrag antworten »
Karlito

Hallo,

im Kontext mit den anderen Fragen geht es denke ich um Probleme aus der theoretischen Informatik. So zum Beispiel um das Abschätzen der Laufzeit von Multiiplikation von großen Zahlen (Komplexitätsklasse).

Ich bewege mich auf sehr dünnem Eis wenn ich mich jetzt weiter dazu äußere, da mit momentan die Zeit fehlt mich damit wieder auseinanderzusetzen... Nach Montag wird das dann wieder besser und ich werde versuchen mir auch die anderen Fragen anzuschauen.

@Jester: bitte dazu noch mal die Fragen so stellen, dass sie leicht lesbar, eindeutig und vollständig spezifiziert sind. Das erhöht auch allgemein die Wahrscheinlichkeit, dass geantwortet wird. In einer Frage wurden Sonderzeichen verwendet, welche nicht dargestellt werden können. Dazu bitte LaTeX verwerden. Es gibt eine entsprechende Umgebung dafür. Das kannst du sehen, wenn Du mal einen Artikel zitierst. Auch wikipedia verwendet LaTeX in fast gleicher form (siehe hier)

Jedenfalls gilt es die Multiuplikation einfach als eine endliche Reihe von Additionen darzustellen, was es am Ende ja auch nur ist... Also eine Multiplikation ist abstrakt gesehen nichts weiter als die Kurzschreibweise für eine Reihe von Additionen.

Bsp.:
[latex]<br />
4*5 & = & 5+5+5+5<br />
7*12 & = & 12+12+12+12+12+12+12<br />
[/latex]

usw...

Damit wird eigentlich auch schon klar, was gemacht werden muss. Das Ergebnis ist am Anfang 0 und wird dann a mal um b erhöht.... Ich habe mal mein Programm entsprechend modifiziert:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv){
	int a = 123;
	int b = 456;
	int result = 0;

	while(a--){
		result += b;
	}
	
	printf("%d\n", result);

	return 0;
}


Verwendet werden hier eben nur besagte Addition und Subtraktion. Eine Schleife ist notwendig, da entschieden werden muss, wann die Multiplikation vollständig ist.

VG,

Karlito
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »