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

📄 guessanswer.cpp

📁 这是书上的代码
💻 CPP
字号:
#include<iostream>

struct AnswerScope
{
	int  Num;
	bool IfNumPossible;
};

class GuessAnswer
{
private:
	int isA,isB,AnswerNum,times;//用户输入的A、B个数;可能答案的个数;用户猜的次数;
	AnswerScope ans[9877];
public:
	GuessAnswer();//构造函数
	int ANumber(int,int,int,int,int);
	int BNumber(int,int,int,int,int);
	void ShowAnswer();//显示可能的答案
	~GuessAnswer(){}//析构函数
};

GuessAnswer::GuessAnswer()
{
	times=1;isA=0;isB=0;//AnswerNum=0;
	
	int t,t1,t2,t3,t4;

		for(t1=0;t1<10;t1++)
			for(t2=0;t2<10;t2++)
				for(t3=0;t3<10;t3++)
					for(t4=0;t4<10;t4++)
					{
						t=1000*t1+100*t2+10*t3+t4;
						ans[t].Num=t;
						if((t1==t2)||(t1==t3)||(t1==t4)||(t2==t3)||(t2==t4)||(t3==t4))
							ans[t].IfNumPossible=false;
						else
							ans[t].IfNumPossible=true;
					}
}

//判断A的个数(数字t和n1,n2,n3,n4连接成的四位数)
int GuessAnswer::ANumber(int t,int n1,int n2,int n3,int n4)
{
	int n=0;
	//将t分解为4个数;
	int m1=t/1000;
	int m2=(t-m1*1000)/100;
	int m3=(t-m1*1000-m2*100)/10;
	int m4=t-m1*1000-m2*100-m3*10;

	if(m1==n1)
		n++;
	if(m2==n2)
		n++;
	if(m3==n3)
		n++;
	if(m4==n4)
		n++;

	return n;
}

//判断B的个数(数字t和n1,n2,n3,n4连接成的四位数)
int GuessAnswer::BNumber(int t,int n1,int n2,int n3,int n4)
{
	int n=0;
	//将t分解为4个数;
	int m1=t/1000;
	int m2=(t-m1*1000)/100;
	int m3=(t-m1*1000-m2*100)/10;
	int m4=t-m1*1000-m2*100-m3*10;

	if((m1==n2)||(m1==n3)||(m1==n4))
		n++;
	if((m2==n1)||(m2==n3)||(m2==n4))
		n++;
	if((m3==n1)||(m3==n2)||(m3==n4))
		n++;
	if((m4==n1)||(m4==n2)||(m4==n3))
		n++;

	return n;
}

void GuessAnswer::ShowAnswer()
{
	int n,n1,n2,n3,n4,a,b;
	do
	{
	//	int n,n1,n2,n3,n4,a,b;
		do
		{
			std::cout<<"第"<<times<<"次:"<<std::endl<<"请输入一个四位数,各位数字不能相同:"<<std::endl;
			std::cin>>n;
			n1=n/1000;
			n2=(n-n1*1000)/100;
			n3=(n-n1*1000-n2*100)/10;
			n4=n-n1*1000-n2*100-n3*10;
		}
		while((n1==n2)||(n1==n3)||(n1==n4)||(n2==n3)||(n2==n4)||(n3==n4));

		std::cout<<"请输入A和B的个数:"<<std::endl;
		std::cin>>a>>b;
		isA=a;isB=b;

		std::cout<<"可能的答案有:"<<std::endl;
		AnswerNum=0;
		for(int t=123;t<9876;t++){
			if((ANumber(t,n1,n2,n3,n4)!=isA)||(BNumber(t,n1,n2,n3,n4)!=isB))
				ans[t].IfNumPossible=false;
			else 
				if(ans[t].IfNumPossible==true)
				{
					AnswerNum++;
					if(t<1000){
						std::cout<<"0";//3位数第一位补0
					}
					std::cout<<t<<" ";
				}
				
		}
		if(AnswerNum==0)
		{
			std::cout<<"请检查输入是否正确!"<<std::endl;
			break;
		}
		std::cout<<"共有"<<AnswerNum<<"个可能的答案。"<<std::endl;
		times++;
	}
	   while(AnswerNum!=1);	
	   std::cout<<"您一共猜了"<<--times<<"次。猜数字结束!"<<std::endl;
	   
}

void main()
{
	char command;
	do
	{
		GuessAnswer m;
		m.ShowAnswer();
		std::cout<<std::endl;
		std::cout<<"您想再来一次吗?Y/N"<<std::endl;
		std::cin>>command;
	}
	while((command=='y')||(command=='Y'));

	std::cout<<"谢谢您使用,再见!";
	
}

⌨️ 快捷键说明

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