这个东西,总感觉有点小小的小问题,但又不知道问题出在哪?请大家帮忙看看吧!
////////////////////////////////////////////////////////////////////////////
// Twenty-Four Points Game //
////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <math.h>
////////////////////////////////////////////////////////////////////////////
int iCount ;
////////////////////////////////////////////////////////////////////////////
void HeadingTips() ;
void RandNums(int Nums[]) ;
void InputNums(int Nums[]) ;
void Filter(int iSums[]) ;
void ArrayN(int a, int b, int c, int d) ;
int CountN(int Flag, int a, int b) ;
void PrintR(int Flag, int i, int j, int k, int a, int b, int c, int d) ;
////////////////////////////////////////////////////////////////////////////
void main()
{
char StartSign ;
int iNum[4], iSum[24] ;
int i, j, k, t, iS ;
while(1)
{
HeadingTips() ;
printf("Please choose an item to continue ...\n") ;
printf("----------------------------------------\n") ;
printf(" 1. Random Numbers.\n") ;
printf(" 2. Input The Numbers.\n") ;
printf(" 3. Exit.\n") ;
printf("----------------------------------------------------------\n") ;
printf("Which one ? (1-3) : ") ;
StartSign=getch() ;
putch(StartSign) ;
switch(StartSign)
{
case '1' :
RandNums(iNum) ;
break ;
case '2' :
InputNums(iNum) ;
break ;
default :
exit(0) ;
}
iCount=0 ;
iS=0 ;
for (i=0 ; i<4 ; i++)
for (j=0 ; j<4 ; j++)
if (j!=i)
for (k=0 ; k<4 ; k++)
if (k!=j && k!=i)
for (t=0 ; t<4 ; t++)
if (t!=i && t!=j && t!=k)
{
iSum[iS]=iNum[i]*14*14*14+iNum[j]*14*14+iNum[k]*14+iNum[t] ;
iS++ ;
}
Filter(iSum) ;
if(iCount==0)
printf("No answer !\n") ;
printf("\nPress any key to return ... ") ;
getch() ;
}
}
////////////////////////////////////////////////////////////////////////////
void HeadingTips()
{
system("cls") ;
printf("Twenty-Four Points Game.\n") ;
printf("========================\n") ;
printf("\n") ;
}
////////////////////////////////////////////////////////////////////////////
void RandNums(int Nums[])
{
int i ;
HeadingTips() ;
srand((unsigned)time(NULL)) ;
for(i=0 ; i<4 ; i++)
Nums[i] = rand() % 13 + 1 ;
printf("The randomize numbers are : ") ;
for(i=0 ; i<4 ; i++)
printf("%d ", Nums[i]) ;
printf("\n") ;
printf("\n") ;
}
////////////////////////////////////////////////////////////////////////////
void InputNums(int Nums[])
{
int i, InputSign, EndSign ;
InputSign=1 ;
while(InputSign)
{
HeadingTips() ;
printf("Input 4 Numbers ( EXM : 1 2 3 4 ) : ") ;
for(i=0 ; i<4 ; i++)
scanf("%d", &Nums[i]) ;
HeadingTips() ;
printf("The numbers you inputed are : ") ;
for(i=0 ; i<4 ; i++)
printf("%d ", Nums[i]) ;
printf("\n") ;
printf("\n") ;
EndSign=0 ;
for(i=0 ; i<4 ; i++)
if( !(Nums[i]>=0 && Nums[i]<=14) )
EndSign++ ;
if(EndSign)
{
printf("Input Error ! Press any key to input again ...") ;
getch() ;
}
else
InputSign=0 ;
}
}
////////////////////////////////////////////////////////////////////////////
void Filter(int iSums[])
{
int i, j, Nums[4] ;
for(i=0 ; i<23 ; i++)
{
for(j=i+1 ; j<24 ; j++)
{
if(iSums[i]==iSums[j])
iSums[j]=2955 ;
}
}
for(i=0 ; i<24 ; i++)
{
for(j=0 ; iSums[i] != 0 ; j++)
{
Nums[j] = iSums[i] % 14 ;
iSums[i] = iSums[i] / 14 ;
}
ArrayN(Nums[3], Nums[2], Nums[1], Nums[0]) ;
}
}
////////////////////////////////////////////////////////////////////////////
void ArrayN(int a, int b, int c, int d)
{
int i, j, k ;
int Ret1, Ret2, Ret3 ;
for(i=1 ; i<=4 ; i++)
for(j=1 ; j<=6 ; j++)
for(k=1 ; k<=6 ; k++)
{
Ret1=CountN(i, a, b) ;
Ret2=CountN(j, Ret1, c) ;
Ret3=CountN(k, Ret2, d) ;
if(Ret3==24)
{
iCount++ ;
PrintR(1, i, j, k, a, b, c, d) ;
}
if( (k==1 || k==2 || k==3) && (j<=4) )
{
Ret1=CountN(i, a, b) ;
Ret2=CountN(j, c, d) ;
Ret3=CountN(k, Ret1, Ret2) ;
if(Ret3==24)
{
iCount++ ;
PrintR(2, i, j, k, a, b, c, d) ;
}
}
if( (k==4) && (j<=4))
{
Ret1=CountN(i, a, b) ;
Ret2=CountN(j, c, d) ;
if(Ret2)
{
Ret3 = Ret1 / Ret2 ;
if(Ret3==24)
{
iCount++ ;
PrintR(2, i, j, k, a, b, c, d) ;
}
}
}
}
}
////////////////////////////////////////////////////////////////////////////
int CountN(int Flag, int a, int b)
{
switch(Flag)
{
case 1 :
return a+b ;
case 2 :
{
if(a>=b)
return a-b ;
else
return 30000 ;
}
case 3 :
return a*b ;
case 4 :
{
if(b!=0)
{
if( (float)a/b == a/b )
return a/b ;
else
return 30000 ;
}
else
return 30000 ;
}
case 5 :
{
if(b>=a)
return b-a ;
else
return 30000 ;
}
case 6 :
{
if(a!=0)
{
if( (float)b/a == b/a )
return b/a ;
else
return 30000 ;
}
else
return 30000 ;
}
default :
return 30000 ;
}
}
////////////////////////////////////////////////////////////////////////////
void PrintR(int Flag, int i, int j, int k, int a, int b, int c, int d)
{
char Sign[7]={'0', '+', '-', '*', '/', '-', '/'} ;
if(Flag==1)
{
if(j==5 || j==6)
{
if(k==5 || k==6)
printf("%d. %d%c(%d%c(%d%c%d))=24\n", iCount, d, Sign[k], c, Sign[j], a, Sign[i], b) ;
else
printf("%d. (%d%c(%d%c%d))%c%d=24\n", iCount, c, Sign[j], a, Sign[i], b, Sign[k], d) ;
}
else if(k==5 || k==6)
printf("%d. %d%c((%d%c%d)%c%d)=24\n", iCount, d, Sign[k], a, Sign[i], b, Sign[j], c) ;
else
printf("%d. ((%d%c%d)%c%d)%c%d=24\n", iCount, a, Sign[i], b, Sign[j], c, Sign[k], d) ;
}
if(Flag==2)
{
if(j==5 || j==6)
printf("%d. (%d%c%d)%c(%d%c%d)=24\n", iCount, a, Sign[i], b, Sign[k], d, Sign[j], c) ;
else
printf("%d. (%d%c%d)%c(%d%c%d)=24\n", iCount, a, Sign[i], b, Sign[k], c, Sign[j], d) ;
}
}
////////////////////////////////////////////////////////////////////////////