求解编程题目<猜数字>C++/C

Description

猜数字游戏是文曲星上的一款打发时间的小游戏。游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么。每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确的位置上。
比如计算机随机产生的数字为1122。如果玩家猜1234,因为1,2这两个数字同时存在于这两个数中,而且1在这两个数中的位置是相同的,所以计算机会告诉玩家猜对了2个数字,其中一个在正确的位置。如果玩家猜1111,那么计算机会告诉他猜对2个数字,有2个在正确的位置。
现在给你一段猜数字的过程,你的任务是根据这段对话确定这个四位数是什么。

Input

输入第一行为一个正整数N(1<=N<=10),表示在这段对话中共有N次问答(不允许出现重复问答)。在接下来的N行中,每行三个整数A,B,C。游戏者猜这个四位数为A,然后计算机回答猜对了B个数字,其中C个在正确的位置上。

Output

一行,如果根据这段对话能确定这个四位数,则输出这个四位数,若不能,则输出"Not sure"。

Sample Input

6
4815 2 1
5716 1 0
7842 1 0
4901 0 0
8585 3 3
8555 3 2

Sample Output

3585

我觉得解决这个问题有几点要注意:实现方面:生成随机数、防止待猜测的数中重复数字
异常方面:处理输入不为四位的情况。
我练习输入输出、类型转换的时候做过一个类似功能的,但是有些地方不完善。
guess0.cpp
// Guess0.cpp : Defines the entry point for the console application.
//

//最后一次正确时,运行不正确

//猜数字
//产生的随机数每次都是1740,而给result赋值时每次都是1242。
//前者原因:rand的问题,该方法需要与srand一起使用;后者是类型转化过程出错

//可以考虑加上时间,按照时间长短给予不同提示。

#include "StdAfx.h"
#include "head.h"

#include <string.h>
#include <stdlib.h>
#include <afx.h>

#define ARRAY_SIZE 4 //宏,定义要猜的数字位数,默认为4,可以修改
#define CHANCE 10 //可以猜测的次数

char result[ARRAY_SIZE+1]={0};//要猜的数字数组;多定义一位,用于存储结束符
int counter = 0;//记录次数,不得大于CHANCE

int main(int argc, char* argv[])
{
char ans;
do{
process();
printf("是否继续?(是,输入“y”;否输入“n”)");
scanf("%c",&ans);
fflush(stdin);
}while(ans=='y'||ans=='Y');
return 0;
}

void myRand()//生成一个4位数字
{//应该在初始化中首次调用此方法
//把值传给result时容易出错,注意选择方式
//先 生成随机数,截取其各位数字,当有重复时重新生成。
memset(result,0,ARRAY_SIZE);
result[ARRAY_SIZE] = 0;
int i,j;
int nums[ARRAY_SIZE];//中间数组
memset(nums,0,ARRAY_SIZE);

char temp[ARRAY_SIZE][1];//注意!temp[]以及它以后的存储区域都是连续的,不能用temp首地址输出。
for(i=0;i<ARRAY_SIZE;i++)
{
memset(temp[i],'\0',1);
}

srand((unsigned)time(NULL));//使从当前时刻开始生成的随机数不存在重复
//若无此语句,程序每次执行,产生的随机数是按照顺序来的,依次为1740,9482。。。
for (i=0;i<ARRAY_SIZE;i++)
{
nums[i] = rand();
nums[i] = nums[i]%10;

for (j=0;j<i;j++) //消除重复数字
{ //新生成的数字要和前面所有数字比较
while(nums[i]==nums[j]) //遇到重复数字时,重新生成;
{ //此处不可用if,因为重新生成的数字也需要比较一次
nums[i] = rand();
nums[i] = nums[i]%10;
j=0; //一旦重新生成就重新开始比较,计数置0
}
}
sprintf(temp[i],"%d",nums[i]);
result[i] = temp[i][0];//把处理好的数字赋给result
}

result[ARRAY_SIZE] = '0'; //结束符
}

void process()//将获得的数字与已生成数字比较
{
//在菜单中说明
printf("欢迎进入本游戏。\n");
printf("程序将随机生成一个不含重复数字的四位数,然后请您猜测这个四位数。\n");
printf("在猜测的过程中我讲给您适当提示,其中\n");
printf("A代表结果中有且位置正确的数字,B代表结果中有但位置不正确的数字。\n");
printf("在一次游戏结束后,您可以查看结果或者重新开始。\n");

/*
CString inpt;//下面的GetAt调用出现问题,给inpt赋值可以解决
//但是赋值比如为0的话,又会提示长度不对;赋值为0000的话会提示重复数字
//明明在读入的时候,初始赋值已经改变了。
//调试发现虽然inpt已经获得了输入,但是其长度却未改变,应该是接受输入的过程出错
//根本原因在于用scanf读入CString对象的值。虽然能读入,但那只是一个临时值,随时
//会发生“不可预知”的错误。
//所以,改用字符数组或者字符指针实现这一问题
*/
/* //使用字符指针
char *inpt;//缓存输入
inpt = (char *)malloc(ARRAY_SIZE+1);
……
free(inpt);
*/
char inpt[]={0,0,0,'-',0};
char ans=NULL;
do
{
myRand();
printf("请输入一个不含重复数字的%d位数(多于四位将只处理前四位):\n", ARRAY_SIZE);

int count1 = 0, //结果中含该数字、位置正确,即A的值
count2 = 0;//结果中含该数字、位置不正确,即B的值
while(counter<CHANCE)
{
scanf("%s",inpt);
fflush(stdin);

while (judge_length(inpt)||judge_repeat(inpt))
{
printf("请重新输入:\n");
scanf("%s",inpt);
fflush(stdin);
}

int i,j;
count1 = 0;
count2 = 0;
for (i=0;i<ARRAY_SIZE;i++)
{
for (j=0;j<ARRAY_SIZE;j++)
{
if (inpt[j]==result[i])
{
if (i!=j)
count2++;
else
count1++;
}
}
}

if (count1==ARRAY_SIZE)
{
printf("恭喜您,猜对了!\n");
break;
}
else
{
printf("%s %d%c%d%c\n",inpt, count1, 'A', count2, 'B');
}
counter++;
}
if (counter==CHANCE)
{
printf("对不起,您已经用完了10次机会!您可以查看结果或者重新开始。");
printf("您可以输入0来查看正确结果。\n");
char choice;
scanf("%c",&choice);
if (choice=='0')
{
printf("正确结果是%s\n",result);
}
}
counter=0;

printf("继续?(y/n)\n");
scanf("%c",&ans);
fflush(stdin);
} while (ans=='y'||ans=='Y');
}

bool judge_repeat(char inpt[])//判断有无重复数字
{
int i,j;
for(i=0;i<ARRAY_SIZE;i++)
{
for (j=0;j<i;j++)
{
if (inpt[i]==inpt[j])
{
printf("您的输入含有重复数字。\n");
return true;
}
}
}
return false;
}

bool judge_length(char inpt[])//判断输入数字的位数
{
if (inpt[ARRAY_SIZE-1]=='-')//如果C/C++数组名可以调用类似length的
{ //函数,那样实现比较理想
//在声明inpt多加一位,加上条件inpt[ARRAY_SIZE]!=(指定字符),应该可以处理超出的输入
printf("您的输入长度不对。\n");
printf("inpt[ARRAY_SIZE-1] = %c\n",inpt[ARRAY_SIZE-1]);
printf("inpt[ARRAY_SIZE] = %c",inpt[ARRAY_SIZE]);
return true;
}
return false;
}

guess0.h
#include "StdAfx.h"
#include <afx.h>

void process();
bool judge_repeat(char inp[]);
bool judge_length(char inp[]);
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-11-13
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
int stime,a,z,t,i,c,m,g,s,j,k,l[4]; /*j:数字正确的位数 k:位置正确的位数*/
long ltime;
ltime=time(NULL); /*l:数字相同时,人所猜中数字的正确位置*/
stime=(unsigned int)ltime/2;
srand(stime);
z=random(9999); /*计算机想一个随机数*/
printf("I have a number with 4 digits in mind,please guess.\n");
for(c=1;;c++) /*c: 猜数次数计数器*/
{
printf("Enter a number with 4 digits:");
scanf("%d",&g); /*请人猜*/
a=z;j=0;k=0;l[0]=l[1]=l[2]=l[3]=0;
for(i=1;i<5;i++) /*i:原数中的第i位数。个位为第一位,千位为第4位*/
{
s=g;m=1;
for(t=1;t<5;t++) /*人所猜想的数*/
{
if(a%10==s%10) /*若第i位与人猜的第t位相同*/
{
if(m&&t!=l[0]&&t!=l[1]&&t!=l[2]&&t!=l[3])
{
j++;m=0;l[j-1]=t; /*若该位置上的数字尚未与其它数字“相同”*/
} /*记录相同数字时,该数字在所猜数字中的位置*/

if(i==t) k++; /*若位置也相同,则计数器k加1*/
}
s/=10;
}
a/=10;
}
printf("You hane correctly guessed %d digits,\n",j);
printf("and correctly guessed %d digits in exact position.\n",k);
if(k==4) break; /*若位置全部正确,则人猜对了,退出*/
}
printf("Now you have correctly guessed the whole number after %d times.\n",c);
}
第2个回答  2009-11-15
悬赏分0...给个正确答案吧。谢谢。好幸苦的
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,x[10][4],a[10],b[10],sum=0,ans;
int check[10][10]={0};
cin>>n;
for(int i=0;i<n;i++)
{
cin.ignore();
for(int j=3;j>=0;j--)x[i][j]=cin.get()-'0',check[i][x[i][j]]++;
cin>>a[i]>>b[i];
}
for(int i=0;i<10000;i++)
for(int j=0;j<n;j++)
{
int now[10]={0},A=0,B=0;
for(int k=0;k<4;k++)
{
now[i/(int)pow(10.0,k)%10]++;
if(i/(int)pow(10.0,k)%10==x[j][k])B++;
}
for(int k=0;k<10;k++)A+=min(now[k],check[j][k]);
if(A!=a[j]||B!=b[j])break;
if(j==n-1)sum++,ans=i;
}
if(sum==0)cout<<"No answer!";
else if(sum==1)cout<<ans;
else cout<<"Not sure";
system("pause");
return 0;
}本回答被提问者采纳

求解编程题目<猜数字>C++\/C
printf("A代表结果中有且位置正确的数字,B代表结果中有但位置不正确的数字。\\n");printf("在一次游戏结束后,您可以查看结果或者重新开始。\\n");\/ CString inpt;\/\/下面的GetAt调用出现问题,给inpt赋值可以解决 \/\/但是赋值比如为0的话,又会提示长度不对;赋值为0000的话会提示重复数字 \/\/明明...

求反猜数字C\/C++原代码
这游戏老外管它叫 Bulls And Cows(Bulls 是 A,Cows 是 B)。用 C++ 可以这样写:include <iostream> include <string> include <sstream> include <set> include <cstdlib> include <ctime> using namespace std;\/\/ Returns bulls and cows scored by guess on secretNumber.string bullsAndCows...

C++的猜数字题目 和考试的不太一样 是大专生的期末考试 所以各位大虾...
include <stdio.h> include <stdlib.h> include <time.h> int main() { int i,result,an;srand((unsigned)time(NULL));do { result = (unsigned)rand()%90 + 10;for(i = 0; i < 10; ++i) { printf("输入你的答案 : ");scanf("%d",&an);if(an == result) { if(i < 3...

C语言编程题(设计一个猜数字的小游戏)满意再加200分!!!
if(cf>c)printf("第三个数应该比 %d 小一点!\\n",cf); if(cf==c)printf("恭喜!第三个数字对了!就是: %d\\n",cf); \/\/数字比较 if(cf<c)printf("第三个数应该比 %d 大一点!\\n",cf); if(df>d)printf("第四个数应该比 %d 小一点!\\n",df); if(df==d)printf("恭喜!第四个数字对了!

《C语言程序设计课程设计》任务书 设计题目:猜数字游戏
void main(void){ int answer[4]={1,3,5,2},guess,a,b,times=0,i,j;printf("please guess \\n");while (a!=4){a=0;b=0;times++;printf("%d ",times);scanf("%d",&guess);for(i=3;i>-1;i--){ for(j=0;j<4;j++){if((int) (guess\/pow(10,i))==answer[j...

编程高手请进!(C语言)
1.include <stdio.h> include<stdlib.h> include<ctype.h> main(){ int count;\/*猜数字的次数*\/ int number;\/*系统产生的随机数字*\/ int guess;\/*程序员输入数字*\/ char yes='Y';clrscr();printf("\\nNow let us play the game.\\n Guess the number:");while (toupper(yes)=='Y'...

C语言,C语言源代码到底是什么意思
然后写个猜数字 控制台程序 接下来用MFC给他写个界面 让大家知道学习这些算法到底有什么用 再往后,我可能会一直教界面编程 直到你们感觉到自己的算法需要深入学习 然后再回过头去学算法 别用什么垃圾TC了,这都什么年代了 新手建议VC6即可,又可以学算法 也能开发MFC界面程序 对电脑配置要求也不搞 ...

C语言编程题(设计一个猜数字的小游戏)满意再加200分!!!
int a,b,c,d; int af,bf,cf,df; if(aa==num) { printf("恭喜!你猜对了!四个数就是:%d\\n",num); return(0); } else { a=(num-num%1000)\/1000; b=(num%1000-(num%1000)%100)\/100; c=((num%1000)%100-((num%1000)%100)%10)\/10; \/\/获取默认四个数字 d=((num%1000)%100)%...

相似回答
大家正在搜