⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24_point.cpp

📁 本人自已寫的一個24點的計算器 希望大家多多的幫我改正。 有什麽更好的算法
💻 CPP
字号:
// 24_point.cpp : Defines the entry point for the console application.
//-------------------------------------------------------------------------------------------
#include "stdafx.h"  //定義控制台程序的頭文件
#include "stdlib.h"
#include <iostream>
#include <string>
using namespace std;  //聲明類庫文件
//-----------------------------------------------------------------------------------------------
int four[4],three[3],two,g;  //定義用於保存數據的變量

void count(int s[],int i,int j );  //聲明以下自定義的三個函數

void com(int i,int j,int p,int q,int m,int n,int num,int b[]);

//int check(int s[]);

string insert_last(string s,int q,int b[]);

string string_insert(string s,int p,int i,int j);

//-----------------------------------------------------------------------------------------------

void main()    //進入主體程序
{ 
  int i,j,m,n,x,p,q,num,a[4],b[4];
  cout<<"\n*******************24 點計算器**********************"<<endl;
  cout<<"本程序仍晉宇光的大作,望大家多多指點,不盛感激!!!!!!!"<<endl;
  cout<<"\n本程序的功能是完成對用戶給出的四個數進行運算,找出所有能夠計算出24的組合!!!!"<<endl;
  cout<<"參數說明:請輸入四個自然數,否則程序不予處理!!!!!"<<endl;
  cout<<"請輸入你要給出的四個數:"<<endl;
  
   while(1) {cout<<"第一個數:"; cin>>four[0]; if(four[0]<=0) cout<<"你輸入的數是非法的!"<<endl;else break;}
   while(1) {cout<<"第二個數:"; cin>>four[1]; if(four[1]<=0) cout<<"你輸入的數是非法的!"<<endl;else break;}
   while(1) {cout<<"第三個數:"; cin>>four[2];if(four[0]<=0) cout<<"你輸入的數是非法的!"<<endl;else break;}
   while(1) {cout<<"第四個數:"; cin>>four[3];if(four[0]<=0) cout<<"你輸入的數是非法的!"<<endl;else break;}
   cout<<"你輸入的四個數分別爲:"<<endl;
   for(i=0;i<4;i++)  cout<<four[i]<<",";
   cout<<endl<<"以下是程序輸出的結果:"<<endl;
   //以下程序便進入了計算和查找!!!!!!!!!!!!!!!!!!!
   g=1;
   for(i=0;i<3;i++)
	   for(j=i+1;j<4;j++)
	   {  x=1;
	      for(num=0;num<4;num++)
			  if(num!=i&&num!=j)  {three[x]=four[num]; x++;}
          
		  count(a,four[i],four[j]);  //將fout數組當中兩個數的四則運算的結果保存到a[]數組當中
		  		           
		  for(p=0;p<4;p++)
		  { if(a[p]!=-1)
			{three[0]=a[p]; 		    
		    
			 for(m=0;m<2;m++)
				for(n=m+1;n<3;n++)				
				{ 
				  for(num=0;num<3;num++) if(num!=m&&num!=n) two=three[num];				  
				  
				  count(b,three[m],three[n]);  //將three數組當中的兩個數的四則運算結果保存到b[]中
				                    
				  for(q=0;q<4;q++)
				  { if(b[q]!=-1)
				    {if((b[q]+two)==24) com(four[i],four[j],p,q,three[m],three[n],1,b); 
				    
					 if((b[q]*two)==24) com(four[i],four[j],p,q,three[m],three[n],3,b);
                    
					 if(b[q]>two) 
					 {if((b[q]-two)==24)   com(four[i],four[j],p,q,three[m],three[n],2,b);
					  if(two!=0)
					   if((b[q]%two)==0) if((b[q]/two)==24)  com(four[i],four[j],p,q,three[m],three[n],4,b);
					 }
					 else
					 {if((two-b[q])==24)   com(four[i],four[j],p,q,three[m],three[n],2,b);
                      if(b[q]!=0) if((two%b[q])==0)if((two/b[q])==24) com(four[i],four[j],p,q,three[m],three[n],4,b);
					 }
					}
				  }
				}			 
		    }
		  }

	   }
}

//-------------------------------------------------------------------------------------------
void count(int s[],int i,int j )  //將i和j進行四則運算並把結果保存到s[]數組當中
{ 
  s[0]=i+j;
  if(i>=j) 
  {s[1]=i-j;  
    if(j!=0) if(i%j==0) s[3]=i/j; else s[3]=-1;
    else s[3]=-1;
  }
  else 
  {s[1]=j-i; 
   if(i!=0) if(j%i==0) s[3]=j/i; else s[3]=-1;
   else s[3]=-1;
  }
  s[2]=i*j;
}
  
//-----------------------------------------------------------------------------------------------

string string_insert(string s,int p,int i,int j)   //將運算結果字符化並保存到string類當中
{ char c[10]; 
  
  if(i!=-1)
  switch (p)
  {case 0:
	{itoa(i,c,10); s.insert(0,c);s.insert (s.size(),"+");itoa(j,c,10);s.insert(s.size(),c);break;}
   case 1:
     if(i>=j)
		{itoa(i,c,10); s.insert(0,c); s.insert (s.size(),"-");itoa(j,c,10); s.insert(s.size(),c);break;}
     else 
	 {itoa(j,c,10); s.insert(0,c); s.insert (s.size(),"-");itoa(i,c,10); s.insert(s.size(),c);break;}
   case 2:
	   {itoa(i,c,10); s.insert (0,c);s.insert (s.size(),"*");itoa(j,c,10);s.insert(s.size(),c); break;}
   case 3:
     if(i>=j)
	    {itoa(i,c,10); s.insert(0,c); s.insert (s.size(),"/"); itoa(j,c,10); s.insert(s.size(),c);break;}
	 else
	    {itoa(j,c,10); s.insert(0,c); s.insert (s.size(),"/"); itoa(i,c,10); s.insert(s.size(),c);break;}
  }
  else
  switch (p)  //將另一個數插
  {case 0:
	 {s.insert(s.size(),"+"); itoa(j,c,10); s.insert(s.size(),c);break;}
   case 1:
	 if(three[0]>=j)
	 {s.insert(s.size(),"-"); itoa(j,c,10); s.insert(s.size(),c);break;}
	 else
	 {s.insert(0,"-"); itoa(j,c,10); s.insert(0,c);break;}
   case 2:
	   {s.insert(s.size(),"*");itoa(j,c,10);s.insert(s.size(),c);break;}
   case 3:
	   if(three[0]>=j)
	   {s.insert(s.size(),"/");itoa(j,c,10);s.insert(s.size(),c);break;}
	   else
	   {s.insert(0,"/");itoa(j,c,10);s.insert(0,c);break;}
   }
   //cout<<"string_insert is call:"<<s<<endl;
   return s; 
  
}

//-----------------------------------------------------------------------------------------------------
void com(int i,int j,int p,int q,int m,int n,int num,int b[])
{ string s,temp;    
  s=string_insert(s,p,i,j); // s當中進入兩個數
  s.insert(0,"("); s.insert (s.size(),")");
  if(m==three[0]||n==three[0])
   if(m==three[0]) 
	   {s=string_insert(s,q,-1,n);s=insert_last(s,q,b);}  //S當中再一次進入兩個數
   else            
	   {s=string_insert(s,q,-1,m);s=insert_last(s,q,b);}  //S當中再一次進入兩個數
  else
    temp=string_insert(temp,q,m,n); //S當中有兩個數,temp當中也有兩個數,下面的程序是把這兩個變量聯起來
  //cout<<"temp.size()="<<temp.size()<<endl;
  if(temp.size()!=0)  //聯接S和TEMP這兩個字段
  { temp.insert(0,"(");temp.insert(temp.size(),")");
    switch (num)
	{ case 1:
	  { s.insert (s.size(),"+");s.insert(s.size(),temp);break;}
      case 2:
	    if(b[q]>=two)
	      {s.insert(0,"-");s.insert (0,temp);break;}
	    else
	      {s.insert (s.size(),"-");s.insert (s.size (),temp);break;}
      case 3:
	    {s.insert (s.size(),"*");s.insert (s.size(),temp);break;}
     case 4:
	   if(b[q]>=two)
	     {s.insert(0,"/");s.insert (0,temp);break;}
	   else
	     {s.insert(s.size(),"/");s.insert(s.size(),temp);break;}
   }
  }
  cout<<"第"<<g<<"個結果是:"<<s<<"=24"<<endl;  g++;
}

//------------------------------------------------------------------------------------------------------------------------------


//--------------------------------------------------------------------------------------------------------------------------------

string insert_last(string s,int q,int b[])
{ char ch[10];
  if((b[q]+two)==24)  {s.insert(0,"("); s.insert(s.size(),")"); s.insert(s.size(),"+"); itoa(two,ch,10);s.insert(s.size(),ch);}
  if((b[q]*two)==24)  {s.insert(0,"("); s.insert(s.size(),")"); s.insert(s.size(),"*"); itoa(two,ch,10);s.insert(s.size(),ch);}
  if(b[q]>=two) 
	{ if((b[q]-two)==24) {s.insert(0,"("); s.insert(s.size(),")"); s.insert(s.size(),"-"); itoa(two,ch,10);s.insert(s.size(),ch);}
      if((b[q]/two)==24) {s.insert(0,"("); s.insert(s.size(),")"); s.insert(s.size(),"/"); itoa(two,ch,10);s.insert(s.size(),ch);}
	}
  else 
	{ if((two-b[q])==24)  {s.insert(0,"("); s.insert(s.size(),")"); s.insert(0,"-"); itoa(two,ch,10);s.insert(0,ch);}
      if((two/b[q])==24) {s.insert(0,"("); s.insert(s.size(),")"); s.insert(0,"/"); itoa(two,ch,10);s.insert(0,ch);}
	}
  return s;
}
//---------------------------------------------------------------------------------------------------------------------------
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -