While schleife bricht ab obwhol sie es nicht soll.

  • Themenstarter Themenstarter cobretti
  • Beginndatum Beginndatum
C

cobretti

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

int isAutomorphicNumber (long long int number)                                     //Funktion um zu prüfen ob die Zahl Automorph ist

{
	int AiZiffern1[20];
	int AiZiffern2[20];
	int i = 0;
	int j = 0;
	int n = 0;
	int x = 0;
	int z = 0;
	long long int itemp = 0;

	itemp = number;                                                                 //Speichern der Zahl in der Hilfsvariable itemp

	while (number>=1)
	{	
		AiZiffern1[i] = number%10;
		i++;
		number = number/10;
	}

	

	itemp = itemp*itemp;                                                              //Quadrat der Ursprünglichen Zahl wird berechnet

	while (itemp>=1)                                                                  //Einzelne Stellen des Quadrats der Zahl werden in String gespeichert
	{
		AiZiffern2[j] = itemp%10;
		j++;
		itemp = itemp/10;
	}

	

	for (n=0; n<i; n++)                                                                //Strings die das Quadrat und die ursprüngliche Zahl enthalten werden bis zur Stelle i verglichen
		if (AiZiffern1[n] != AiZiffern2[n])                                            //wobei i die Länge der ursprünglichen Zahl ist
			x++;
	z = (x==0);

return z;
}




 
int isPandigitalNumber (long long int number)                                          //Funktion zur Ermittlung ob die Zahl Pandigital ist
{

int AiZiffern[20];
	int i = 0;
	int j = 0;
	int k = 0;
	int l = 0;
	int m = 0;
	
	while (number>=1)                                                                   //Einzelne Stellen der Zahl werden von hinten nach vorne in String gespeichert
	{
		AiZiffern[i] = number%10;
		i++;
		number = number/10;
	}
	
	i--;
	
	for (k=0; k<=i; k++)                                                                 //Zahlen werden vorne nach hinten mit den anderen verglichen, d.h. die 0. Zahl wird mit
	{	
		for (j=0; j<(i-k); j++)                                                          //den darauffolgenden verglichen usw.
			if (AiZiffern[k] == AiZiffern[k+j+1])
				l++;		                                                             //Falls eine Zahl zweimal vorkommt wird l heraufgestzt
	}

	if ((l==0) && (i==9))
		m = 1;

	return m;
	
}


int isDeficientNumber (long long int number)                                              //Funktion zur Ermittlung ob eine Zahl Defizient ist
{ 
	
	long long summe = 0;
	long long i = 0;
	long long iStart = number/2;
	
	for (i=iStart; i > 1; i--)                                                             //Schleife ermittelt alle echten Teiler und addiert diese
		if (number%i == 0)
			summe = summe + i;

	if (summe > number)
	
		return 0;
	else return 1;
}

int main () {
	int b = 1;
	long long int a = 0;
	do {

		printf("\t\t\t bitte geben sie eine zahl ein \n");

		scanf ("%lli", &a);
		printf ("\n");


		printf("Defizient: %i\n\n", isDeficientNumber(a));
		printf("Pandigital: %i\n\n", isPandigitalNumber(a));
		printf("Automorph: %i\n\n", isAutomorphicNumber(a));
		

		printf ("wollen sie eine weitere zahl ueberpruefen? (1 (ja) oder 0 (nein) eingeben)\n\n\n");

        scanf ("%i", &b);
		}
	while (b==1);
}


Das programm liest eine Zahl ein und prüft dann ob die zahl automorph, pandigital oder defizient ist.
das funktioniert auch soweit gut
mein problem ist jetzt nur wenn ich die zahl 0123456789 oder 012345678 eingeb rechnet das programm alles aus wie gewollt, am ende beendet es sich aber automatisch, so als ob die while schleife am ende mit nein(0) beantwortet worden wäre.
woran liegt das? bei allen anderen zahlen die ich ausprobiert hab funktionierts
 
Manche Compiler verstehen long long int, manche setzten das gleich mit long int. (Größe abhängig vom Betriebssystem (32 Bit, 64 Bit))

EDIT: long bzw. short brauchen kein int mehr. Das ist automatisch.
 
hab visual studio 2008

hab an den variablen formaten schon recht viel rumgespielt aber es will einfach nicht klappen, bei 0123456789 beendet sich das programm immer nach einem durchlauf

ich darf außerdem nur int variabeln benutzen
 
Hallo cobretti,

Die Datentypen spielen evtl. hier keine Rolle.
füge mal in deiner main() zwischen Zeile 108 und 109 folgendes ein:

Code:
fflush (stdin);

Damit löscht man den Eigabepuffer, sollte man nach scanf() immer aufrufen.

Traveller
 
Der Effekt von fflush auf Eingabeströme ist gemäss C-Standard nicht definiert und daher sollte das tunlichst vermieden werden!
 
Vermutung:
Bei C werden Zahlen mit führenden Nullen als Zahlen im Oktalformat angesehen. Deswegen wird auch deine eingegebene Zahl als Oktalzahl eingelesen, und der Einleseprozess stoppt bei der '8', weil dies keine Oktal-Ziffer ist. Diese '8' bzw. '89' wird dann in Variable b eingelesen, und das ist natürlich ungleich 1. Du kannst leicht überprüfen, ob es stimmt, wenn du dir die Variablen a und b mit einem printf ausgeben lässt.
 
Hi.

Die Vermutung von Vereth ist richtig.

Du mußt den %lld Formatstring benutzen (d für dezimal).

Gruß
 
Zurück