求解编程题目<猜数字>C++/C
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求解编程题目<猜数字>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[]); 参考技术A #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);
参考技术B 悬赏分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的主要内容,如果未能解决你的问题,请参考以下文章