C Geselschaftsspiel: Nenne alle Vielfache einer Zahl UND ...

PhiE

Redakteur Pro
Teammitglied
Registriert
Aug. 2009
Beiträge
2.717
Moin,


ich bin gerade dabei ein Programm zu schreiben, in Visual C, dass alle Vielfachen einer Zahl ausgibt.

Dazu habe ich eine Eingabe- und eine Berechnungs-Funktion erstellt.
In der zweiten Funktion habe ich eine Zählschleife die meinen Wertbereich abarbeitet.

Um es kurz zu machen: Die Berechnung der Vielfachen und deren Ausgabe funktioniert ohne Probleme, das war nicht das Problem.

Allerdings soll ich jetzt auch alle Zahlen ausgeben, die die eingegebene Zahl enthalten.

Also Eingabe ist z.B. die 4.

d.h. ich gebe 8 12 16 usw aus, aber auch 41 42 43 44 45 usw. und auch 141 oder 431 und 994, also jede Zahl, in der die 4 auftaucht.

Ich habe absolut keinen Dunst, wie man sowas bewerkstelligen soll.

Hat jemand einen Ansatz, wie man da ran gehen könnte?

Danke für die Tipps.
 
In deinem Wertebereich: itoa () auf den Wert anwenden und das Resultat mittels strchr ('4',....) durchsuchen.
 
Es geht ja hier um 2 Aufgaben. Einerseits die Ermittlung aller Vielfachen, andererseits die Ausgabe aller Zahlen, in der die 4 vorkommt. Beides sicherlich bis zu einer gewissen Grenze.
Daher würde ich diese Aufgaben auch funktional trennen. Die Ermittlung der Vielfachen ist relativ einfach, da reicht quasi eine for- oder while Schleife mit Zählvariable. Die Ausgabe der Zahlen ein auch einfach zu bewerkstelligen, eine Schleife mit Zählvariable reicht auch hier. Man muss natürlich die Zahlen als String interpretieren und dann den "Buchstaben" 4 suchen.
 
warum aufwärts zählen? gibts ne obere grenze?
sonst kann das verdammt aufwändig werden.
und vor allem: werden auch vielfache von zahlen größer 9 benötigt? also 441755 als treffer bei der suche für 17 zum bsp. auszugeben.
 
Hey,

ich hab keinen Dunst von Visual C.
In C++ würde ich es wie folgt halten:

Code:
for (int i = 0; i <= 1000; i++){
[INDENT]if (i % zahl == 0 || ((string) i).find((string)zahl) != string::npos ) // npos = -1 [/INDENT]
[INDENT][INDENT]cout << i << endl;[/INDENT][/INDENT]
}

Damit hättest du eine saubere Reihenfolge aufsteigender Zahlen :)

Gruß
 
Wo liegt das Problem?
Iteriere über den gewünschten Wertebereich, wandle die aktuelle Zahl in einen String um und schaue, ob der eingegebene Wert darin vorkommt. Wenn ja, dann ausgeben.
 
@M4$T3R CH13F: Das wird kein C++ Compiler schlucken! Du castest ein int nach string, das funktioniert nur leider nicht! C++ hilft dem TE sowieso nicht weiter und zusätzlich ist dein Code auch noch falsch, also wozu postest du ihn überhaupt?

Die Grundidee stimmt jedoch. Die Zahl in eine Zeichenkette umwandeln und dann die Zeichenkette nach der gewünschten Ziffer durchsuchen.

Gruß
BlackMark
 
Hallo,

Die wilde Inge schrieb:
ich bin gerade dabei ein Programm zu schreiben, in Visual C, dass
  • alle Vielfachen einer Zahl ausgibt.
  • Allerdings soll ich jetzt auch alle Zahlen ausgeben, die die eingegebene Zahl enthalten.

Sollst Du das in C oder in C++ machen ("Visual C" gibt es seit 10 Jahren nicht mehr, nur Visual C++ - das kann C und C++) und warum?

Oder spielt die Sprache keine Rolle? Wofür sollst Du das machen?

Ausserdem:

Allerdings soll ich jetzt auch alle Zahlen ausgeben, die die eingegebene Zahl enthalten

Oo ;-)
 
Zuletzt bearbeitet:
bin selber drauf gekommen, trotzdem danke
mit der Umwandlung in Char schwebte mir anfänglich auch vor, ist aber viel zu kompliziert, wenn man meine Lösung betrachtet

Code:
// ****	Funktion Gesellschaftsspiel		****
	void gesellschaft (void)
		{
		int Konstante=0, RechenV=0, i=0, Zahl=0, m = 0;
		system ("cls");
	// Menü
		printf ("Willkommen im Programm \' Gesellschaftsspiel \'\n\n");
		printf ("*************************************************\n\n");
		printf ("Bitte geben Sie eine einstellige Zahl ein:\t");
		scanf  ("%d",&Zahl);
		printf ("*************************************************\n\n");
		printf ("\nDie Werte lauten wie folgt: %d \t", Zahl);
		Konstante = Zahl;
		Zahl = Zahl+1;

			for (i=Zahl; i <= 1000; i++)
		
				{
					RechenV = Zahl;
					

					if (Zahl%Konstante == 0) 
						{
						printf ("%d  ", Zahl);
						}

					else

					{

					if (RechenV >= 100 && RechenV/100 == Konstante)

						{
						printf ("%d  ", Zahl);
						}
	
						RechenV = RechenV%100;
				
					

					if (RechenV >=10 && RechenV/10 == Konstante)
						{
						printf ("%d  ", Zahl);
						}

						RechenV = RechenV%10;


					if (RechenV == Konstante)
						{
						printf ("%d  ", Zahl);
						}

					}

					Zahl=Zahl+1;
				}

Das ist nur ein Ausschnitt, nicht wundern
Ergänzung ()

@blöderidiot

Visual C++

Was haste an dem Ende nicht verstanden ? Hab doch per Beispiel geklärt, dass ich z.B. die 983 ausgegeben haben will, weil ich zusätzlich alle Zahlen haben möchte, wo eine "3" drin auftaucht.
 
Zuletzt bearbeitet:
Die wilde Inge schrieb:
Ergänzung ()

@blöderidiot

Visual C++

Was haste an dem Ende nicht verstanden ? Hab doch per Beispiel geklärt, dass ich z.B. die 983 ausgegeben haben will, weil ich zusätzlich alle Zahlen haben möchte, wo eine "3" drin auftaucht.

Du hast aber gesagt: Alle Zahlen und nicht spezifiziert, dass es nur bis 1000 gehen soll.
By the way, Du kannst Deinen Code, der recht gut ist, noch etwas kürzen, etwa so:

Code:
 void gesellschaft(int z, int maxz)
{
 int i;
 char puffer[64];
 
 for(i=z+1; i<=maxz; i++) {
    sprintf(puffer, "%d", i);
    if(i % z == 0)            printf ("VIELFACHE - %d\n", i);
    if(strchr(puffer, '0'+z)) printf ("ENTHALTEN - %d\n", i);
 }
}

Bei Programmieren trennt man gerne die "Zuständigkeiten" in Funktionen auf. Sprich: eine Funktion zur Eingabe, eine Funktion zur Berechnung und eine main-Funktion, die das alles zusammenführt:

Code:
#include <stdio.h>
#include <string.h>

 int eingabe(void)
{
 char puffer[2], text[] = "Willkommen im Programm 'Gesellschaftsspiel'\n"
                          "******************************************\n"
                          "Bitte geben Sie eine einstellige Zahl ein:\t";
 int zahl = 0;
 printf(text);
 sscanf(fgets(puffer, sizeof(puffer), stdin), "%d", &zahl);
 return zahl;
}

 void gesellschaft(int z, int maxz)
{
 char puffer[64], text[] = "******************************************\n"
                           "Die Werte fuer %d lauten wie folgt:\n";
 int i;
 printf(text, z);
 for(i=z+1; i<=maxz; i++) {
    sprintf(puffer, "%d", i);
    if(i % z == 0)            printf ("VIELFACHE - %d\n", i);
    if(strchr(puffer, '0'+z)) printf ("ENTHALTEN - %d\n", i);
 }
}

 int main()
{
 setvbuf(stdout, NULL, _IONBF, 0); /* suffering from buffering */
 gesellschaft( eingabe(), 1000 );
}

Viel Spass!
 
Zuletzt bearbeitet:
:D :D :D ja nee, natürlich nicht "alle" Zahlen im wortwörtlichen Sinne.

Danke für den Tipp. Kann ich aber leider nicht umsetzen, die Syntax und teils sogar die Symantik ist mir gänzlich unbekannt. Dann kriege ich später Probleme wenn ichs erklären soll :D
 
Zurück
Oben