C++實現http下載 && 24點計算編碼風格
#include <afxinet.h>
#define RECVPACK_SIZE 4096
//下載檔案並儲存為新檔名
//url為網路下載地址,strSaveFile為本地儲存檔案地址
bool DownloadSaveFiles(TCHAR* url, TCHAR* strSaveFile)
{
bool ret=false;
CInternetSession Sess(_T("lpload"));
Sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 2000);
//2秒的連線超時
Sess.SetOption(INTERNET_OPTION_SEND_TIMEOUT, 2000);
//2秒的傳送超時
Sess.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT, 2000);
//2秒的接收超時
Sess.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT, 2000);
//2秒的傳送超時
Sess.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 2000); //2秒的接收超時
DWORD dwFlag = INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RELOAD ;
CHttpFile* cFile = NULL;
char *pBuf = NULL ;
int nBufLen = 0 ;
do
{
try{
cFile = (CHttpFile*)Sess.OpenURL(url,1,dwFlag);
DWORD dwStatusCode;
cFile->QueryInfoStatusCode(dwStatusCode);
if(dwStatusCode == HTTP_STATUS_OK)
{
//查詢檔案長度
DWORD nLen=0;
cFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, nLen);
//CString strFilename = GetFileName(url,TRUE);
nBufLen=nLen;
if(nLen<=0)
break;
//分配接收資料快取
pBuf = (char*)malloc(nLen+8);
ZeroMemory(pBuf,nLen+8);
char *p=pBuf;
while(nLen>0)
{
//每次下載8K
int n = cFile->Read(p,(nLen<RECVPACK_SIZE)?nLen:RECVPACK_SIZE);
//接收完成退出迴圈
if (n <= 0)
break ;
//接收快取後移
p+= n ;
//剩餘長度遞減
nLen -= n ;
}
//如果未接收完中斷退出
if (nLen != 0) break;
//接收成功儲存到檔案
CFile file(strSaveFile, CFile::modeCreate | CFile::modeWrite);
file.Write(pBuf,nBufLen);
file.Close();
ret = true;
}
}
catch(...)
{
break;
}
}while(0);
//釋放快取
if(pBuf)
{
free(pBuf);
pBuf=NULL;
nBufLen = 0 ;
}
//關閉下載連線
if(cFile)
{
cFile->Close();
Sess.Close();
delete cFile;
}
return ret;
}
//24點計算
//定義下面5種運算順序:
// ((A @ B) @ C) @ D
// (A @ B) @ (C @ D)
// (A @ (B @ C)) @ D
// A @ ((B @ C) @ D)
// A @ (B @ (C @ D))
//23.99<計算結果<24.01
//其中:
//1≤A、B、C、D≤13
//@為“+、-、*、/”之一
//用浮點數計算,迴圈遍歷以上所有情況即可。
#include <stdio.h>
int A,B,C,D,N;
float r,r1,r2;
char op1,op2,op3;
char opc[4]={'+','-','*','/'};
void main() {
N=0;
for (A=1;A<=13;A++) {
for (B=1;B<=13;B++) {
for (C=1;C<=13;C++) {
for (D=1;D<=13;D++) {
for (op1=0;op1<4;op1++) {
for (op2=0;op2<4;op2++) {
for (op3=0;op3<4;op3++) {
// ((A @ B) @ C) @ D
r=(float)A;
switch (op1) {case 0:r =r +B ;break;case 1:r =r -B ;break;case 2:r =r *B ;break;case 3:r =r /B ;break;}
switch (op2) {case 0:r =r +C ;break;case 1:r =r -C ;break;case 2:r =r *C ;break;case 3:r =r /C ;break;}
switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;}
if (23.99f<r && r<24.01f) {N++;printf("%8d: ((%2d%c%2d)%c%2d)%c%2d=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}
// (A @ B) @ (C @ D)
r1=(float)A;
switch (op1) {case 0:r1=r1+B ;break;case 1:r1=r1-B ;break;case 2:r1=r1*B ;break;case 3:r1=r1/B ;break;}
r2=(float)C;
switch (op3) {case 0:r2=r2+D ;break;case 1:r2=r2-D ;break;case 2:r2=r2*D ;break;case 3:r2=r2/D ;break;}
switch (op2) {case 0:r =r1+r2;break;case 1:r =r1-r2;break;case 2:r =r1*r2;break;case 3:if (-0.01f<r2 && r2<0.01f) goto STEP3; r=r1/r2;break;}
if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c%2d)%c(%2d%c%2d)=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}
// (A @ (B @ C)) @ D
STEP3:
r=(float)B;
switch (op2) {case 0:r =r +C ;break;case 1:r =r -C ;break;case 2:r =r *C ;break;case 3:r =r /C ;break;}
switch (op1) {case 0:r =A +r ;break;case 1:r =A -r ;break;case 2:r =A *r ;break;case 3:if (-0.01f<r && r <0.01f) goto STEP4; r=A /r ;break;}
switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;}
if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c(%2d%c%2d))%c%2d=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}
// A @ ((B @ C) @ D)
STEP4:
r=(float)B;
switch (op2) {case 0:r =r +C ;break;case 1:r =r -C ;break;case 2:r =r *C ;break;case 3:r =r /C ;break;}
switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;}
switch (op1) {case 0:r =A +r ;break;case 1:r =A -r ;break;case 2:r =A *r ;break;case 3:if (-0.01f<r && r <0.01f) goto STEP5; r=A /r ;break;}
if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c((%2d%c%2d)%c%2d)=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}
// A @ (B @ (C @ D))
STEP5:
r=(float)C;
switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;}
switch (op2) {case 0:r =B +r ;break;case 1:r =B -r ;break;case 2:r =B *r ;break;case 3:if (-0.01f<r && r <0.01f) continue; r=B /r ;break;}
switch (op1) {case 0:r =A +r ;break;case 1:r =A -r ;break;case 2:r =A *r ;break;case 3:if (-0.01f<r && r <0.01f) continue; r=A /r ;break;}
if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c(%2d%c(%2d%c%2d))=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}
}
}
}
}
}
}
}
}
// 1: (( 1+ 1)+ 1)* 8=24
// 2: ( 1+( 1+ 1))* 8=24
// 3: ( 1+ 1)*( 1+11)=24
// ... ...
// 53280: (13+13)/(13/12)=24
// 53281: (13-(13/13))+12=24
// 53282: 13-((13/13)-12)=24
//24點計算改良版
#include <stdio.h>
float Number[4];
char Option[3];
char OptionList[4] ={ '+', '-', '*', '/'};
int N = 0;
float FuncSwitch(float A, int Opt, float B) {
float Ret;
switch (Opt) {
case '+' : Ret = A + B;break;
case '-' : Ret = A - B;break;
case '*' : Ret = A * B;break;
default
: Ret = (B > -0.01f && B < 0.01f) ? -12345678.9 : A / B;break;
}
return Ret;
}
void FuncCalcul() {
float r;
r = FuncSwitch(FuncSwitch(FuncSwitch(Number[0], Option[0], Number[1]), Option[1], Number[2]), Option[2], Number[3]);
if (23.99f<r && r<24.01f) {N++;printf("%8d: ((%2d%c%2d)%c%2d)%c%2d=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);}
r = FuncSwitch(FuncSwitch(Number[0], Option[0], Number[1]), Option[1], FuncSwitch(Number[2], Option[2], Number[3]));
if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c%2d)%c(%2d%c%2d)=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);}
r = FuncSwitch(FuncSwitch(Number[0], Option[0], FuncSwitch(Number[1], Option[1], Number[2])), Option[2], Number[3]);
if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c(%2d%c%2d))%c%2d=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);}
r = FuncSwitch(Number[0], Option[0], FuncSwitch(FuncSwitch(Number[1], Option[1], Number[2]), Option[2], Number[3]));
if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c((%2d%c%2d)%c%2d)=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);}
r = FuncSwitch(Number[0], Option[0], FuncSwitch(Number[1], Option[1], FuncSwitch(Number[2], Option[2], Number[3])));
if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c(%2d%c(%2d%c%2d))=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);}
}
void FuncOption(int OptionCount) {
int i = 0;
if(OptionCount == 3) {
FuncCalcul();
} else {
for (i = 0; i <= 3; i++) {
Option[OptionCount] = OptionList[i];
FuncOption(OptionCount + 1);
}
}
}
void FuncNumber(int NumberCount) {
int i = 0;
if (NumberCount == 4) {
FuncOption(0);
} else {
for (i = 1; i <= 13; i++) {
Number[NumberCount] = (float)i;
FuncNumber(NumberCount + 1);
}
}
}
int main() {
FuncNumber(0);
return 0;
}
//C++11版的
#include<stdio.h>
#include<algorithm>
#include<Functional>
using namespace std;
typedef std::pair<function<float(float,float)>,char> Type;
Type f[4] = { Type([](float x,float y ){return x+y;},'+'), Type([](float x,float y ){return x-y;},'-') ,Type([](float x,float y ){return x*y;},'*') , Type([](float x,float y ){return x/y;},'/') };
float Num[4] = { 3 , 3 , 8 , 8 };//答案為 8/(3-8/3) ;
int main( int argc, char* argv[] )
{
sort( Num , Num + 4 );
do
{
for_each( f , f+4 , [=](Type x)
{
for_each( f,f+4, [=](Type y)
{
for_each( f,f+4, [=](Type z)
{
float sum = z.first( y.first( x.first( Num[0], Num[1] ) , Num[2] ) , Num[3] );
if( ( sum > 23.9 ) && ( sum < 24.1 ) )
{
printf( "((%d%c%d)%c%d)%c%d", ( int )Num[0], x.second , ( int )Num[1], y.second , ( int )Num[2], z.second, ( int )Num[3] );
exit(0);
}
sum = z.first( x.first( Num[0], Num[1] ) , y.first( Num[2] , Num[3] ) );
if( ( sum > 23.9 ) && ( sum < 24.1 ) )
{
printf( "(%d%c%d)%c(%d%c%d)", ( int )Num[0], x.second , ( int )Num[1], z.second , ( int )Num[2], y.second, ( int )Num[3] );
exit(0);
}
sum = z.first( Num[0] , y.first( Num[1] , x.first( Num[2], Num[3] ) ) );
if( ( sum > 23.9 ) && ( sum < 24.1 ) )
{
printf( "%d%c(%d%c(%d%c%d))", ( int )Num[0], z.second , ( int )Num[1], y.second , ( int )Num[2], x.second, ( int )Num[3] );
exit(0);
}
}
);
}
);
}
);
}while( next_permutation( Num , Num + 4 ) );
return 0;
}
//
//isnan未定義
/**************************************
*
* 定義下面5種運算順序:
* ( ( A @ B ) @ C ) @ D
* ( A @ B ) @ ( C @ D )
* ( A @ ( B @ C ) ) @ D
* A @ ( ( B @ C ) @ D )
* A @ ( B @ ( C @ D ) )
* 其中:
* A, B, C, D在區間[ 1, 13 ]上
* @為[ +, -, *, / ]
* 23.99 < 計算結果 < 24.01
*
**************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
//#include <stdbool.h>
#include <string.h>
#include <math.h>
#define RESULT_MIN 23.99f
#define RESULT_MAX 24.01f
#define OP_NUM 3
#define VAR_NUM 4
#define VAR_MIN 1
#define VAR_MAX 13
enum Operator {
op_add,
op_sub,
op_mul,
op_div,
op_system
};
const char op_to_char[] = { '+', '-', '*', '/' };
inline bool between( float num, float max, float min ) {
return ( isnan( num ) ?
false :
( num > max ?
false :
( num < min ?
false :
true ) ) );
}
inline float compute( float num1, float num2, enum Operator op ) {
switch ( op ) {
case op_add: return num1 + num2;
case op_sub: return num1 - num2;
case op_mul: return num1 * num2;
case op_div: return num1 / num2;
// this is a bug
default: exit( 1 ); break;
}
}
inline bool number_system_inc( uint8_t *first, uint8_t *last, int system ) {
uint8_t *iterator;
if ( ++( *last ) >= system ) {
iterator = last;
do {
*iterator = 0;
if ( --iterator < first ) {
return false;
}
} while ( ( *iterator += 1 ) >= system );
}
return true;
}
int main( int argc, char **argv ) {
uint8_t op_iterator_first[ OP_NUM ];
uint8_t *op_iterator_last = op_iterator_first + OP_NUM - 1;
uint8_t var_iterator_first[ VAR_NUM ];
uint8_t *var_iterator_last = var_iterator_first + VAR_NUM - 1;
int counter = 0;
#ifdef FILE
FILE *fp = fopen( "list.txt", "w" );
#endif
// fill zero
memset( op_iterator_first, 0, sizeof( op_iterator_first ) );
while ( true ) {
// fill zero
memset( var_iterator_first, 0, sizeof( var_iterator_first ) );
while ( true ) {
float A = ( float )var_iterator_first[ 0 ] + 1.0f;
float B = ( float )var_iterator_first[ 1 ] + 1.0f;
float C = ( float )var_iterator_first[ 2 ] + 1.0f;
float D = ( float )var_iterator_first[ 3 ] + 1.0f;
float R = 0.0f;
#define U( index ) op_to_char[ op_iterator_first[ index ] ]
#ifdef FILE
#define P( text ) fprintf( fp, text "=%.0f\n", ( int )A, U( 0 ), ( int )B, U( 1 ), ( int )C, U( 2 ), ( int )D, R ); counter++
#else
#define P( text ) printf( text "=%.0f\n", ( int )A, U( 0 ), ( int )B, U( 1 ), ( int )C, U( 2 ), ( int )D, R ); counter++
#endif
#define _( num1, num2, index ) compute( num1, num2, op_iterator_first[ index ] )
// ((A@B)@C)@D
if ( between( R = _( _( _( A, B, 0 ), C, 1 ), D, 2 ) , RESULT_MAX, RESULT_MIN ) ) {
P( "((%d%c%d)%c%d)%c%d" );
}
// (A@B)@(C@D)
if ( between( R = _( _( A, B, 0 ), _( C, D, 2 ), 1 ) , RESULT_MAX, RESULT_MIN ) ) {
P( "(%d%c%d)%c(%d%c%d)" );
}
// (A@(B@C))@D
if ( between( R = _( _( A, _( B, C, 1 ), 0 ), D, 2 ) , RESULT_MAX, RESULT_MIN ) ) {
P( "(%d%c(%d%c%d))%c%d" );
}
// A@((B@C)@D)
if ( between( R = _( A, _( _( B, C, 1 ), D, 2 ), 0 ) , RESULT_MAX, RESULT_MIN ) ) {
P( "%d%c((%d%c%d)%c%d)" );
}
// A@(B@(C@D))
if ( between( R = _( A, _( B, _( C, D, 2 ), 1 ), 0 ) , RESULT_MAX, RESULT_MIN ) ) {
P( "%d%c(%d%c(%d%c%d))" );
}
#undef U
#undef _
if ( number_system_inc( var_iterator_first, var_iterator_last, VAR_MAX - VAR_MIN + 1 ) == false ) {
break;
}
}
if ( number_system_inc( op_iterator_first, op_iterator_last, op_system ) == false ) {
break;
}
}
printf( "solve total: %d\n", counter );
#ifdef FILE
fclose( fp );
#endif
return 0;
}
//C/C++ code
#include <cstdio>
#include <algorithm>
using namespace std;
int main(int argc, char* argv[])
{
using Ft = float;
using Op = Ft(*)(Ft, Ft);
pair<Op, char> f[] = {
{[](Ft x, Ft y) {return x + y;}, '+'},
{[](Ft x, Ft y) {return x - y;}, '-'},
{[](Ft x, Ft y) {return x * y;}, '*'},
{[](Ft x, Ft y) {return x / y;}, '/'},
};
pair<Ft(*)(Ft, Ft, Ft, Ft, Op, Op, Op), const char*> g[] = {
{[](Ft a, Ft b, Ft c, Ft d, Op x, Op y, Op z) {return z(y(x(a, b), c), d);},
"%8d: ((%2d%c%2d)%c%2d)%c%2d=24\n"},
{[](Ft a, Ft b, Ft c, Ft d, Op x, Op y, Op z) {return y(x(a, b), z(c, d));},
"%8d: (%2d%c%2d)%c(%2d%c%2d)=24\n"},
{[](Ft a, Ft b, Ft c, Ft d, Op x, Op y, Op z) {return z(x(a, y(b, c)), d);},
"%8d: (%2d%c(%2d%c%2d))%c%2d=24\n"},
{[](Ft a, Ft b, Ft c, Ft d, Op x, Op y, Op z) {return x(a, z(y(b, c), d));},
"%8d: %2d%c((%2d%c%2d)%c%2d)=24\n"},
{[](Ft a, Ft b, Ft c, Ft d, Op x, Op y, Op z) {return x(a, y(b, z(c, d)));},
"%8d: %2d%c(%2d%c(%2d%c%2d))=24\n"},
};
int count = 0;
Ft r[13]{};
generate(begin(r), end(r), [=]()mutable{return Ft(++count);});
for (auto a : r) for (auto b : r) for (auto c : r) for (auto d : r)
for (auto x : f) for (auto y : f) for (auto z : f) for (auto u : g)
{
Ft sum = u.first(a, b, c, d, x.first, y.first, z.first);
if (sum > 23.99 && sum < 24.01)
{
printf(u.second, ++count, (int)a, x.second, (int)b, y.second, (int)c, z.second, (int)d);
}
}
return 0;
}
//Haskell 版本:Python
code
import Text.Printf
type Operand a = (String, a -> a -> a)
opts = [ ("+",(+)), ("-",(-)), ("*",(*)), ("/",(/)) ] :: [Operand Float]
grps :: [Operand Float] -> [Float] -> [(String, Float)]
grps [(nx,x),(ny,y),(nz,z)] [a,b,c,d] = [
( printf "((%2.0f%s%2.0f)%s%2.0f)%s%2.0f" a nx b ny c nz d, ((a `x` b) `y` c) `z` d ),
( printf "(%2.0f%s%2.0f)%s(%2.0f%s%2.0f)" a nx b ny c nz d, (a `x` b) `y` (c `z` d) ),
( printf "(%2.0f%s(%2.0f%s%2.0f))%s%2.0f" a nx b ny c nz d, (a `x` (b `y` c))`z` d ),
( printf "%2.0f%s((%2.0f%s%2.0f)%s%2.0f)" a nx b ny c nz d, a `x`((b `y` c) `z` d) ),
( printf "%2.0f%s(%2.0f%s(%2.0f%s%2.0f))" a nx b ny c nz d, a `x` (b `y` (c `z` d)) ) ]
target = 24 :: Int
input = [1..13] :: [Int]
check d v = dd - epsilon < v && v < dd + epsilon
where epsilon = 0.01 :: Float
dd = fromIntegral d
results = filter (check target . snd) [r|v<-vs,o<-os,r<-grps o v]
where ns = map fromIntegral input :: [Float]
vs = [[a,b,c,d]|a<-ns,b<-ns,c<-ns,d<-ns]
os = [[x,y,z]|x<-opts,y<-opts,z<-opts]
putResult :: (String, Float) -> IO ()
putResult = uncurry $ printf "%s = %2.0f\n"
//Java code
public class Operator {
private static float MIN_NUMBER = 23.99f;
private static float MAX_NUMBER = 24.01f;
private static char[] OPERS = { '+', '-', '*', '/' };
public static void main(String[] args) {
// 0至13
int a, b, c, d;
// 0:+; 1:-; 2:*; 3:/
int oper1, oper2, oper3;
int count = 0;
float r1, r2, r3;
String message;
for (a = 0; a <= 13; a++) {
for (b = 0; b <= 13; b++) {
for (c = 0; c <= 13; c++) {
for (d = 0; d <= 13; d++) {
for (oper1 = 0; oper1 <= 3; oper1++) {
for (oper2 = 0; oper2 <= 3; oper2++) {
for (oper3 = 0; oper3 <= 3; oper3++) {
// ((A @ B) @ C) @ D
try {
r1 = calculate(a, b, oper1);
r2 = calculate(r1, c, oper2);
r3 = calculate(r2, d, oper3);
if (r3 > MIN_NUMBER && r3 < MAX_NUMBER) {
count++;
message = String
.format("%d: ((%d %s %d) %s %d) %s %d",
count, a,
OPERS[oper1], b,
OPERS[oper2], c,
OPERS[oper3], d);
System.out.println(message);
}
} catch (Exception e) {
}
// (A @ B) @ (C @ D)
try {
r1 = calculate(a, b, oper1);
r2 = calculate(c, d, oper3);
r3 = calculate(r1, r2, oper2);
if (r3 > MIN_NUMBER && r3 < MAX_NUMBER) {
count++;
message = String
.format("%d: (%d %s %d) %s (%d %s %d)",
count, a,
OPERS[oper1], b,
OPERS[oper2], c,
OPERS[oper3], d);
System.out.println(message);
}
} catch (Exception e) {
}
// (A @ (B @ C)) @ D
try {
r1 = calculate(b, c, oper2);
r2 = calculate(a, r1, oper1);
r3 = calculate(r2, d, oper3);
if (r3 > MIN_NUMBER && r3 < MAX_NUMBER) {
count++;
message = String
.format("%d: (%d %s (%d %s %d)) %s %d",
count, a,
OPERS[oper1], b,
OPERS[oper2], c,
OPERS[oper3], d);
System.out.println(message);
}
} catch (Exception e) {
}
// A @ ((B @ C) @ D)
try {
r1 = calculate(b, c, oper2);
r2 = calculate(r1, d, oper3);
r3 = calculate(a, r2, oper1);
if (r3 > MIN_NUMBER && r3 < MAX_NUMBER) {
count++;
message = String
.format("%d: %d %s ((%d %s %d) %s %d)",
count, a,
OPERS[oper1], b,
OPERS[oper2], c,
OPERS[oper3], d);
System.out.println(message);
}
} catch (Exception e) {
}
// A @ (B @ (C @ D))
try {
r1 = calculate(c, d, oper3);
r2 = calculate(b, r1, oper2);
r3 = calculate(a, r2, oper1);
if (r3 > MIN_NUMBER && r3 < MAX_NUMBER) {
count++;
message = String
.format("%d: %d %s (%d %s (%d %s %d))",
count, a,
OPERS[oper1], b,
OPERS[oper2], c,
OPERS[oper3], d);
System.out.println(message);
}
} catch (Exception e) {
}
}
}
}
}
}
}
}
}
private static float calculate(float a, float b, int oper) {
float result = 0;
switch (oper) {
case 0:
result = a + b;
break;
case 1:
result = a - b;
break;
case 2:
result = a * b;
break;
case 3:
result = a / b;
break;
}
return result;
}
}
//Java code
object TwentyFour {
def operate(a: Double, op: String, b: Double): Double = op match {
case "+" => a + b
case "-" => a - b
case "*" => a * b
case "/" => a / b
}
val funcs = List(
(n1: Double, op1: String, n2: Double, op2: String, n3: Double, op3: String, n4: Double) => {
("((" + n1 + op1 + n2 + ")" + op2 + n3 + ")" + op3 + n4,
operate(operate(operate(n1, op1, n2), op2, n3), op3, n4))
},
(n1: Double, op1: String, n2: Double, op2: String, n3: Double, op3: String, n4: Double) => {
("(" + n1 + op1 + n2 + ")" + op2 + "(" + n3 + op3 + n4 + ")",
operate(operate(n1, op1, n2), op2, operate(n2, op3, n4)))
},
(n1: Double, op1: String, n2: Double, op2: String, n3: Double, op3: String, n4: Double) => {
("(" + n1 + op1 + "(" + n2 + op2 + n3 + "))" + op3 + n4,
operate(operate(n1, op1, operate(n2, op2, n3)), op3, n4))
},
(n1: Double, op1: String, n2: Double, op2: String, n3: Double, op3: String, n4: Double) => {
(n1 + op1 + "((" + n2 + op2 + n3 + ")" + op3 + n4 + ")",
operate(n1, op1, operate(operate(n2, op2, n3), op3, n4)))
},
(n1: Double, op1: String, n2: Double, op2: String, n3: Double, op3: String, n4: Double) => {
(n1 + op1 + "(" + n2 + op2 + "(" + n3 + op3 + n4 + "))",
operate(n1, op1, operate(n2, op2, operate(n3, op3, n4))))
})
def main(args: Array[String]) {
val ns = 1 to 13;
val ops = Array("+", "-", "*", "/")
for (a <- ns)
for (op1 <- ops)
for (b <- ns)
for (op2 <- ops)
for (c <- ns)
for (op3 <- ops)
for (d <- ns)
for (func <- funcs) {
val e = func(a, op1, b, op2, c, op3, d)
if (e._2 > 23.99 && e._2 < 24.01)
println(e._1)
}
}
}
//Java
public static void main(String[] args) {
int[] o=new int[]{1,1,1,1};
char[] op=new char[]{'+','-','*','/'};
int e=1,f=1,g=1,sumTimes=0;
double h=0,i=0;
while(o[0]<14){o[1]=1;
while(o[1]<14){o[2]=1;
while(o[2]<14){o[3]=1;
while(o[3]<14){e=1;
while(e<5){f=1;
while(f<5){g=1;
while(g<5){
//((A @ B) @ C) @ D
h=0;
switch(e){case 1:h=o[0]+o[1];break;case 2:h=o[0]-o[1];break;case 3:h=o[0]*o[1];break;case 4:h=o[0]/o[1];break;}
switch(f){case 1:h=h+o[2];break;case 2:h=h-o[2];break;case 3:h=h*o[2];break;case 4:h=h/o[2];break;}
switch(g){case 1:h=h+o[3];break;case 2:h=h-o[3];break;case 3:h=h*o[3];break;case 4:h=h/o[3];break;}
if(h>=23.99&h<=24.01){sumTimes++;
System.out.println(sumTimes+" 公式1:(("+(int)o[0]+op[e-1]+(int)o[1]+")"+op[f-1]+(int)o[2]+")"+op[g-1]+(int)o[3]);
}
h=0;
//(A @ B) @ (C @ D)
switch(e){case 1:h=o[0]+o[1];break;case 2:h=o[0]-o[1];break;case 3:h=o[0]*o[1];break;case 4:h=o[0]/o[1];break;}
switch(f){case 1:i=o[2]+o[3];break;case 2:i=o[2]-o[3];break;case 3:i=o[2]*o[3];break;case 4:i=o[2]/o[3];break;}
switch(g){case 1:h=h+i;break;case 2:h=h-i;break;case 3:h=h*i;break;case 4:h=(i==0?0.0001:h/i);break;}
if(h>=23.99&h<=24.01){sumTimes++;
System.out.println(sumTimes+" 公式2:("+(int)o[0]+op[e-1]+(int)o[1]+")"+op[g-1]+"("+(int)o[2]+op[f-1]+(int)o[3]+")");
}
h=0;
//(A @ (B @ C)) @ D
switch(e){case 1:h=o[1]+o[2];break;case 2:h=o[1]-o[2];break;case 3:h=o[1]*o[2];break;case 4:h=o[1]/o[2];break;}
switch(f){case 1:h=o[0]+h;break;case 2:h=o[0]-h;break;case 3:h=o[0]*h;break;case 4:h=(h==0?0.0001:o[0]/h);break;}
switch(g){case 1:h=h+o[3];break;case 2:h=h-o[3];break;case 3:h=h*o[3];break;case 4:h=(h==0?0.0001:h/o[3]);break;}
if(h>=23.99&h<=24.01){
sumTimes++;
System.out.println(sumTimes+" 公式3:("+(int)o[0]+op[f-1]+"("+(int)o[1]+op[e-1]+(int)o[2]+"))"+op[g-1]+(int)o[3]);
}
h=0;
//A @ ((B @ C) @ D)
switch(e){
case 1:h=o[1]+o[2];break;case 2:h=o[1]-o[2];break;case 3:h=o[1]*o[2];break;case 4:h=o[1]/o[2];break;}
switch(f){case 1:h=h+o[3];break;case 2:h=h-o[3];break;case 3:h=h*o[3];break;case 4:h=(h==0?0.0001:h/o[3]);break;}
switch(g){case 1:h=o[0]+h;break;case 2:h=o[0]-h;break;case 3:h=o[0]*h;break;case 4:h=(h==0?0.0001:o[0]/h);break;}
if(h>=23.99&h<=24.01){sumTimes++;
System.out.println(sumTimes+" 公式4:"+(int)o[0]+op[g-1]+"(("+(int)o[1]+op[e-1]+(int)o[2]+")"+op[f-1]+(int)o[3]+")");
}
//A @ (B @ (C @ D))
h=0;
switch(e){case 1:h=o[2]+o[3];break;case 2:h=o[2]-o[3];break;case 3:h=o[2]*o[3];break;case 4:h=o[2]/o[3];break;}
switch(f){case 1:h=o[1]+h;break;case 2:h=o[1]-h;break;case 3:h=o[1]*h;break;case 4:h=(h==0?0.0001:o[1]/h);break;}
switch(g){case 1:h=o[0]+h;break;case 2:h=o[0]-h;break;case 3:h=o[0]*h;break;case 4:h=(h==0?0.0001:o[0]/h);break;}
if(h>=23.99&h<=24.01){sumTimes++;
System.out.println(sumTimes+" 公式5:"+(int)o[0]+op[g-1]+"("+(int)o[1]+op[f-1]+"("+(int)o[2]+op[e-1]+(int)o[3]+"))");
}
h=0;
g++;
}
f++;
}
e++;
}
o[3]++;
}
o[2]++;
}
o[1]++;
}
o[0]++;
}
}
//C# code
namespace MyConsoleLab
{
class Program
{
delegate float Operation(float num1,float num2);
static Dictionary<int, Operation> Opera = new Dictionary<int, Operation>()
{
{ 0,(x, y) => x + y },
{ 1,(x, y) => x - y },
{ 2,(x, y) => x * y },
{ 3,(x, y) => x / y }
};
static Dictionary<int, string> Translate = new Dictionary<int, string>()
{
{0,"+" },{1,"-" },{2,"*" },{3,"/" }
};
static int count = 0;
static void Main()
{
ForeachNumbers();
Console.WriteLine("program completed! {0} results!",count);
Console.ReadKey();
}
private static void ForeachNumbers()
{
for (int num1 = 1; num1 <= 13; num1++)
{
for (int num2 = 1; num2 <= 13; num2++)
{
for (int num3 = 1; num3 <= 13; num3++)
{
for (int num4 = 1; num4 <= 13; num4++)
{
PrintResult(num1, num2, num3, num4);
}
}
}
}
}
private static void PrintResult(int num1, int num2, int num3, int num4)
{
for (int op1 = 0; op1 < 4; op1++)
{
for (int op2 = 0; op2 < 4; op2++)
{
for (int op3 = 0; op3 < 4; op3++)
{
//((A @ B) @ C) @ D
if (Opera[op3](Opera[op2](Opera[op1](num1, num2), num3), num4) == 24)
{
Console.WriteLine("(({0} {4} {1}) {5} {2}) {6} {3}",
num1, num2, num3, num4, Translate[op1], Translate[op2], Translate[op3]);
count++;
}
//(A @ B) @ (C @ D)
if (Opera[op2](Opera[op1](num1, num2), Opera[op3](num3,num4)) == 24)
{
Console.WriteLine("({0} {4} {1}) {5} ({2} {6} {3})",
num1, num2, num3, num4, Translate[op1], Translate[op2], Translate[op3]);
count++;
}
//(A @ (B @ C)) @ D
if (Opera[op3](Opera[op1](num1, Opera[op2](num2, num3)), num4) == 24)
{
Console.WriteLine("({0} {4} ({1} {5} {2}) {6} {3}",
num1, num2, num3, num4, Translate[op1], Translate[op2], Translate[op3]);
count++;
}
//A @ ((B @ C) @ D)
if (Opera[op1](num1,Opera[op3](Opera[op2](num2, num3), num4)) == 24)
{
Console.WriteLine("{0} {4} (({1} {5} {2}) {6} {3})",
num1, num2, num3, num4, Translate[op1], Translate[op2], Translate[op3]);
count++;
}
//A @ (B @ (C @ D))
if (Opera[op3](num1,Opera[op2](num2,Opera[op3](num3, num4))) == 24)
{
Console.WriteLine("{0} {4} ({1} {5} ({2} {6} {3}))",
num1, num2, num3, num4, Translate[op1], Translate[op2], Translate[op3]);
count++;
}
}
}
}
}
}
}
//Python code
from __future__ import division
operator = ('+', '-', '*', '/')
N = 1
def factors():
for A in xrange(1, 14):
for B in xrange(1, 14):
for C in xrange(1, 14):
for D in xrange(1, 14):
yield A, B, C, D
def opers():
for op1 in xrange(0, 4):
for op2 in range(0, 4):
for op3 in range(0, 4):
yield operator[op1], operator[op2], operator[op3]
def check_res(fmt, A, B, C, D, op1, op2, op3):
global N
sumexp = fmt % (A, op1, B, op2, C, op3, D)
try:
sum = eval(sumexp)
except ZeroDivisionError:
return
if sum > 23.99 and sum < 24.01:
print N, sumexp, "=24"
N += 1
def main():
fact = factors()
for A, B, C, D in fact:
oper = opers()
for op1, op2, op3 in oper:
# ((A @ B) @ C) @ D
check_res("((%d%s%d)%s%d)%s%d", A, B, C, D, op1, op2, op3)
# (A @ B) @ (C @ D)
check_res("(%d%s%d)%s(%d%s%d)", A, B, C, D, op1, op2, op3)
# (A @ (B @ C)) @ D
check_res("(%d%s(%d%s%d))%s%d", A, B, C, D, op1, op2, op3)
# A @ ((B @ C) @ D)
check_res("%d%s((%d%s%d)%s%d)", A, B, C, D, op1, op2, op3)
# A @ (B @ (C @ D))
check_res("%d%s(%d%s(%d%s%d))", A, B, C, D, op1, op2, op3)
if __name__ == "__main__":
main()
//沾了動態語言eval的光啊.(所以執行速度也就比C慢些)。
//JavaScript code
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>demo by zswang</title>
<script type='text/javascript' src='http://code.jquery.com/jquery-1.6.4.js'></script>
<script type='text/javascript'>//<![CDATA[
$(window).load(function(){
function searchExpression(dest, numbers) {
if (!numbers) return;
var precision = 1e-6; // 精度
var dict = {};
function search(numbers, expressions, level, dest, outputs) {
var result;
if ((level <= 1) && (Math.abs(numbers[0] - dest) <= precision)) {
!dict[expressions[0]] && outputs.push(expressions[0]);
dict[expressions[0]] = true;
return true;
}
for (var i = 0; i < level; i++) {
for (var j = i + 1; j < level; j++) {
var A = numbers[i];
var B = numbers[j];
numbers[j] = numbers[level - 1];
var vExpA = expressions[i];
var vExpB = expressions[j];
expressions[j] = expressions[level - 1];
expressions[i] = '(' + vExpA + '+' + vExpB + ')';
numbers[i] = A + B;
if (search(numbers, expressions,
level - 1, dest, outputs)) Result = true;
expressions[i] = '(' + vExpA + '-' + vExpB + ')';
numbers[i] = A - B;
if (search(numbers, expressions,
level - 1, dest, outputs)) Result = true;
expressions[i] = '(' + vExpB + '-' + vExpA + ')';
numbers[i] = B - A;
if (search(numbers, expressions,
level - 1, dest, outputs)) result = true;
expressions[i] = '(' + vExpA + '*' + vExpB + ')';
numbers[i] = A * B;
if (search(numbers, expressions,
level - 1, dest, outputs)) result = true;
if (B != 0) {
expressions[i] = '(' + vExpA + '/' + vExpB + ')';
numbers[i] = A / B;
if (search(numbers, expressions,
level - 1, dest, outputs)) result = true;
}
if (A != 0) {
expressions[i] = '(' + vExpB + '/' + vExpA + ')';
numbers[i] = B / A;
if (search(numbers, expressions,
level - 1, dest, outputs)) result = true;
}
numbers[i] = A;
numbers[j] = B;
expressions[i] = vExpA;
expressions[j] = vExpB;
}
}
return result;
}
if (typeof numbers == "string") {
numbers = numbers.split(/[\s,;g]+/);
}
var expressions = [];
var outputs = [];
for (var i = 0; i < numbers.length; i++) {
numbers[i] = +numbers[i];
expressions.push(numbers[i]);
}
search(numbers, expressions, numbers.length, dest, outputs);
return outputs;
}
$("#go").click(function() {
var outputs = searchExpression(+$("#dest").val(), $("#inputs").val());
$("#outputs").val(outputs && outputs.join("\n"));
});
});//]]>
</script>
</head>
<body>
<body>
<div>
目標數:<input id="dest" value="24"/>
陣列:<input id="inputs" value="10,10,4,4"/><input type="button" id="go" value="計算吧!"/>
</div>
<div>
<textarea id="outputs"></textarea>
</div>
</body>
</html>
/×
無效程式碼
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef float ( __cdecl *TYPE_MYFUN )( float , float );
float FunAdd( float x, float y )
{
return x + y;
}
float FunSub( float x, float y )
{
return x - y;
}
float FunMul( float x, float y )
{
return x * y;
}
float FunDiv( float x, float y )
{
return x / y;
}
int main( int argc, char* argv[] )
{
float Num[4] = { 3 , 3 , 8 , 8 };//答案為 8/(3-8/3) ;
//float Num[4] = { 5 , 5 , 5 , 1 };//答案為5/(5-(1/5));
sort( Num , Num + 4 );
static char op[4] = { '+' , '-' , '*' , '/'};
TYPE_MYFUN Fun[4] = { FunAdd , FunSub , FunMul , FunDiv };
do
{
for( int x = 0 ; x < 4 ; x++ )
{
for( int y = 0 ; y < 4 ; y++ )
{
for( int z = 0 ; z < 4 ; z++ )
{
float sum = Fun[z]( Fun[y]( Fun[x]( Num[0], Num[1] ) , Num[2] ) , Num[3] );
if( ( sum > 23.9 ) && ( sum < 24.1 ) )
{
printf( "((%d%c%d)%c%d)%c%d", ( int )Num[0], op[x] , ( int )Num[1], op[y] , ( int )Num[2], op[z], ( int )Num[3] );
return 0;
}
sum = Fun[z]( Fun[x]( Num[0], Num[1] ) , Fun[y]( Num[2] , Num[3] ) );
if( ( sum > 23.9 ) && ( sum < 24.1 ) )
{
printf( "(%d%c%d)%c(%d%c%d)", ( int )Num[0], op[x] , ( int )Num[1], op[z] , ( int )Num[2], op[y], ( int )Num[3] );
return 0;
}
sum = Fun[z]( Num[0] , Fun[y]( Num[1] , Fun[x]( Num[2], Num[3] ) ) );
if( ( sum > 23.9 ) && ( sum < 24.1 ) )
{
printf( "%d%c(%d%c(%d%c%d))", ( int )Num[0], op[z] , ( int )Num[1], op[y] , ( int )Num[2], op[x], ( int )Num[3] );
return 0;
}
}
}
}
}while( next_permutation( Num , Num + 4 ) );
return 0;
}
#include <stdio.h>
int rpn (int *);
int main (void)
{
int A, B, C, D, N;
int c[8];
int op1, op2, op3;
char opc[4] = {'+', '-', '*', '/'};
N = 0;
for (A = 1; A <= 13; A++){
for (B = 1; B <= 13; B++){
for (C = 1; C <= 13; C++){
for (D = 1; D <= 13; D++){
for (op1 = 0; op1 < 4; op1++){
for (op2 = 0; op2 < 4; op2++){
for (op3 = 0; op3 < 4; op3++){
c[0] = A; c[1] = B; c[2] = opc[op1]; c[3] = C;
c[4] = opc[op2]; c[5] = D; c[6] = opc[op3]; c[7] = 0;
if (rpn(c) == 0){
N++;
printf ("%8d: ((%2d%c%2d)%c%2d)%c%2d = 24\n", N, A, opc[op1], B,
opc[op2], C, opc[op3], D);
}
c[0] = A; c[1] = B; c[2] = opc[op1]; c[3] = C;
c[4] = D; c[5] = opc[op2]; c[6] = opc[op3]; c[7] = 0;
if (rpn(c) == 0){
N++;
printf ("%8d: (%2d%c%2d)%c(%2d%c%2d) = 24\n", N, A, opc[op1], B,
opc[op3], C, opc[op2], D);
}
c[0] = A; c[1] = B; c[2] = C; c[3] = opc[op1];
c[4] = opc[op2]; c[5] = D; c[6] = opc[op3]; c[7] = 0;
if (rpn(c) == 0){
N++;
printf ("%8d: (%2d%c(%2d%c%2d))%c%2d = 24\n", N, A, opc[op2], B,
opc[op1], C, opc[op3], D);
}
c[0] = A; c[1] = B; c[2] = C; c[3] = opc[op1];
c[4] = D; c[5] = opc[op2]; c[6] = opc[op3]; c[7] = 0;
if (rpn(c) == 0){
N++;
printf ("%8d: %2d%c((%2d%c%2d)%c%2d) = 24\n", N, A, opc[op3], B,
opc[op1], C, opc[op2], D);
}
c[0] = A; c[1] = B; c[2] = C; c[3] = D;
c[4] = opc[op1]; c[5] = opc[op2]; c[6] = opc[op3]; c[7] = 0;
if (rpn(c) == 0){
N++;
printf ("%8d: %2d%c(%2d%c(%2d%c%2d)) = 24\n", N, A, opc[op3], B,
opc[op2], C, opc[op1], D);
}
}
}
}
}
}
}
}
system("pause");
return 0;
}
#define MAXVAL 10
int sp;
double val[MAXVAL];
void push (double f)
{
val[sp++] = f;
}
double pop (void)
{
return val[--sp];
}
int rpn (int *c)
{
double op2;
int ch;
sp = 0;
while (1){
ch = *c++;
switch (ch){
case '+':
push(pop() + pop());
break;
case '*':
push(pop() * pop());
case '-':
op2 = pop();
push(pop() - op2);
break;
case '/':
op2 = pop();
if (op2 != 0.00)
push(pop() / op2);
else
return 1;
break;
case 0:
op2 = pop();
if (23.99 < op2 && op2 < 24.01)
return 0;
else
return 1;
break;
default:
push((double)(ch - 0));
break;
}
}
}
×/
相關文章
- JavaScript編碼風格指南JavaScript
- JavaScript 編碼風格指南JavaScript
- 談談JavaScript編碼風格JavaScript
- PHP編碼風格規範PHP
- 良好的HTML編碼風格HTML
- CoffeeScript 編碼風格指南
- Python 編碼風格指南Python
- Base24編碼以及解碼的實現
- 現代C++風格的新元素C++
- Python 編碼風格參考Python
- PHP 編碼風格規範指南PHP
- 編碼風格:Mvc模式下SSM環境,程式碼分層管理MVC模式SSM
- Google C++程式設計風格指南GoC++程式設計
- [C++][程式設計風格]C++命名規則C++程式設計
- 【轉】c++ http下載檔案C++HTTP
- 編碼規範(四)之程式碼風格
- Google C++程式設計風格指南(六):程式碼註釋GoC++程式設計
- 編碼風格和開發習慣
- JS實現24點遊戲JS遊戲
- Google C++ 程式設計風格指南:類GoC++程式設計
- Google C++ 程式設計風格指南:格式GoC++程式設計
- Google C++ 程式設計風格指南:其他 C++ 特性GoC++程式設計
- Google C++程式設計風格指南(三):C++ 類GoC++程式設計
- C++實現簡易計算器C++
- 基於libcurl實現REST風格http/https的get和postRESTHTTP
- HTTP 內容編碼,也就這 2 點需要知道 | 實用 HTTPHTTP
- 用c++實現淨現值的計算C++
- 影像壓縮編碼碼matlab實現——算術編碼Matlab
- 影像壓縮編碼碼matlab實現——常用引數計算Matlab
- 良好的JS編碼習慣與風格JS
- PEP 8 Python編碼風格指南概要Python
- 你需要懂點程式設計風格程式設計
- Google C++ 程式設計風格指南:作用域GoC++程式設計
- Google C++ 程式設計風格指南:註釋GoC++程式設計
- Google C++程式設計風格指南(七):格式GoC++程式設計
- Laravel HTTP—— RESTFul 風格路由的使用與原始碼分析LaravelHTTPREST路由原始碼
- Python實現24點遊戲Python遊戲
- C++ 實現簡略計算π的程式C++