Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : c hilfe für bf programm, prüfen ob mehrere variablen unterschiedlich sind



for_maniac
17-11-2005, 19:32
Hi @ all

ich bräuchte hilfe bei diesem bruteforce Programm(siehe unten).

Die Aufgabe dazu lautet: send+more=money welche zahl steht für welchen buchstaben damit der ausdruck war ist?

a) Meine Frage kann man das Programm noch besser, schöner übersichtlicher machen?
b) in der test funktion bei der if anweisung würde ich gerne auch noch prüfen ob alle variablen unterschiedlich sind, wie macht man das ohne alles einzeln einzugeben (also s1 != e1, s1 != o1, usw. das wird zu unübersichtlich)



#include<stdio.h>

int main(){
int s,e,n,d,m,o,r,y;


for(s=0;s<=9;s++){
for(e=0;e<=9;e++){
for(n=0;n<=9;n++){
for(d=0;d<=9;d++){
for(m=0;m<=9;m++){
for(o=0;o<=9;o++){
for(r=0;r<=9;r++){
for(y=0;y<=9;y++){test(s,e,n,d,m,o,r,y);}
test(s,e,n,d,m,o,r,y);}
test(s,e,n,d,m,o,r,y);}
test(s,e,n,d,m,o,r,y);}
test(s,e,n,d,m,o,r,y);}
test(s,e,n,d,m,o,r,y);}
test(s,e,n,d,m,o,r,y);}
test(s,e,n,d,m,o,r,y);}
scanf("%l",&s);
return 0;
}


int test(s1,e1,n1,d1,m1,o1,r1,y1){
int sum1,sum2,sum3,erg;
sum1 = 1000*s1 + 100*e1 +10*n1 + d1 ;
sum2 = 1000*m1 + 100*o1 +10*r1 + e1 ;
erg = 10000*m1 + 1000*o1 +100*n1 +10*e1 +y1;
sum3 = sum1 +sum2;
if(sum3 =! 0 && sum3 == erg && sum3 >= 10000){printf(" send\n %i\n+ more\n %i\n------\n money\n %i\n\n",sum1,sum2,erg);}
return 0;}


MFG for_maniac

peschmae
17-11-2005, 20:49
Eventuell hab ich auch gerade gepennt, aber statt deiner Schachtel sollte es doch auch das tun:



for(s=0;s<=9;s++)
for(e=0;e<=9;e++)
for(n=0;n<=9;n++)
for(d=0;d<=9;d++)
for(m=0;m<=9;m++)
for(o=0;o<=9;o++)
for(r=0;r<=9;r++)
for(y=0;y<=9;y++)
test(s,e,n,d,m,o,r,y);


oder nicht?

Eventuell auch besser was mit nem Array statt da x int-Variablen.

MfG Peschmä

for_maniac
17-11-2005, 21:21
Jo geht thx :)

hier nochmal die neue kürzere version
Für problem b) hab ich allerdings noch keine idee


#include<stdio.h>

int main(){
int s,e,n,d,m,o,r,y;


for(s=0;s<=9;s++){
for(e=0;e<=9;e++){
for(n=0;n<=9;n++){
for(d=0;d<=9;d++){
for(m=0;m<=9;m++){
for(o=0;o<=9;o++){
for(r=0;r<=9;r++){
for(y=0;y<=9;y++){test(s,e,n,d,m,o,r,y);}}}}}}}}

scanf("%l",&s);
return 0;
}


int test(s1,e1,n1,d1,m1,o1,r1,y1){
int sum1,sum2,sum3,erg;
sum1 = 1000*s1 + 100*e1 +10*n1 + d1 ;
sum2 = 1000*m1 + 100*o1 +10*r1 + e1 ;
erg = 10000*m1 + 1000*o1 +100*n1 +10*e1 +y1;
sum3 = sum1 +sum2;
if(sum3 =! 0 && sum3 == erg && sum3 >= 10000){printf(" send\n %i\n+ more\n %i\n------\n money\n %i\n\n",sum1,sum2,erg);}
return 0;}

peschmae
17-11-2005, 22:05
b) kannst du mit einem Array und einer schleife recht einfach erledigen. d.h. wenn du statt Namen s,e,n,... einfach ein int-Array machst


bool different = true;
for (int i = 0; i < len; i++)
for (int j = 0; j < len; j++)
if (i != j && array[i] == array[j])
different = false;

oder so ähnlich. Und dann loop-unrolling bei den Compileroptionen anschalten ;)

MfG Peschmä

for_maniac
18-11-2005, 16:25
Von Arrays hab ich bisher leider noch keine Ahnung gibt es da nicht eine einfachere(Anfängerfreundlichere) Methode?

MFG for_maniac

peschmae
18-11-2005, 18:35
*Noch* einfacher? ;)

MfG Peschmä

BLUESCREEN3D
18-11-2005, 18:46
@for_maniac:

Wenn du das ohne Arrays lösen willst, dann kommst du AFAIK nicht an einer etwas unübersichtliche Lösung vorbei.

Aber anstatt das ganze erst in der test-Funktion zu prüfen kannst du das auch schon innerhalb der for-Schleifen machen:

for(s=0;s<=9;s++)
{
for(e=0;e<=9;e++)
{
if (e!=s)
{
for(n=0;n<=9;n++)
{
if ((n!=s) && (n!=e))
{
for(d=0;d<=9;d++)
usw.

@peschmae:



bool different = true;
for (int i = 0; i < len; i++)
for (int j = 0; j < len; j++)
if (i != j && array[i] == array[j])
different = false;
oder so ähnlich.
besser so ähnlich :)

bool different = true;
for (int i = 0; (i < len-1) && different; i++)
for (int j = i+1; j < len; j++)
if (array[i] == array[j])
{
different = false;
break;
}

Noch besser wäre es, das ganze gleich als Funktion zu schreiben.