Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
---- Softwaretechnik (http://www.informatikerboard.de/board/board.php?boardid=18)
----- C for schleife multiplikation (http://www.informatikerboard.de/board/thread.php?threadid=1837)


Geschrieben von 0664jester am 25.03.2014 um 20:54:

  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?



Geschrieben von Karlito am 25.03.2014 um 21:41:

 

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



Geschrieben von as_string am 25.03.2014 um 21:45:

 

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



Geschrieben von 0664jester am 28.03.2014 um 08:03:

 

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



Geschrieben von 0664jester am 28.03.2014 um 08:05:

 

wie spalte ich a*b mod c am besten auf?



Geschrieben von as_string am 28.03.2014 um 11:04:

 

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



Geschrieben von Karlito am 28.03.2014 um 12:18:

 

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


Forensoftware: Burning Board, entwickelt von WoltLab GmbH