猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
输入格式:
输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。
输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。
输入样例:
58 4
70
50
56
58
60
-2
输出样例:
Too big
Too small
Too small
Good Guess!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
第一次提交有测试点未通过
#include<stdio.h>
int main()
{
int num,N,guess;
int cnt = 0; // 计数输入负数前的数字个数
int number = 0; // 第一次猜中时的位置
scanf("%d %d", &num, &N);
scanf("%d", &guess);
while( guess>=0 ){ // 输入负数停止
cnt ++;
// 在未猜对且在要求的猜测最大次数范围内给出提示或记录第一次猜中的位置
if( cnt<=N && number==0 ){
if( guess>num ){ // 给出提示
printf("Too big\n");
} else if( guess<num ){
printf("Too small\n");
} else{ // 标记第一次猜中时的位置(当输入数字个数不超过N时能够进行记录)
number = cnt;
}
}
scanf("%d", &guess);
}
// 分情况输出
if( cnt<N ){ // 到达N次前用户输入负数
printf("Game Over\n");
} else{
if( number ){ // 在N次前猜中
if( number>3 ){
printf("Good Guess!\n");
}else if( number>1 ){
printf("Lucky You!\n");
} else{
printf("Bingo!\n");
}
} else {
printf("Game Over\n");
}
}
return 0;
}
测试点未通过的原因猜测:上面代码是在输入负数时结束循环,未设置跳出点,但题目要求N次及以内猜对就结束,或者N次以内输入负数结束,或超过N次未猜对则结束,可能是由于没有及时结束导致了错误,故仍然以读入负数作为离开循环的条件。如果循环次数小于N且未输入相等值则提示“Game Over”(意味着提前输入负数结束);在循环次数小于N时,如果猜测不准给出提示,猜测正确给出结果并跳出循环,当循环次数大于N时,提示“Game Over”(意味着N次内未猜对)并跳出
修改后通过:
#include<stdio.h>
int main()
{
int num,N,guess;
int cnt = 0; // 计数输入负数前的数字个数
int number = 0; // 第一次猜中时的位置
scanf("%d %d", &num, &N);
scanf("%d", &guess);
while( guess>=0 ){ // 输入负数停止
cnt ++;
// 在要求的猜测最大次数范围内且之前没有猜对过的情况下给出提示或给出猜中情况
if( cnt<=N && number==0 ){
if( guess>num ){ // 给出提示
printf("Too big\n");
} else if( guess<num ){
printf("Too small\n");
} else{ // 标记第一次猜中时的位置并根据条件输出
number = cnt;
if( number>3 ){
printf("Good Guess!\n");
}else if( number>1 ){
printf("Lucky You!\n");
} else {
printf("Bingo!\n");
}
break;
}
}
if( cnt==N+1 ){ // 超过N次未猜中则提示“Game Over”,并结束程序
printf("Game Over\n");
break;
}
scanf("%d", &guess);
}
// 到达N次前用户输入负数
if( cnt<N && number==0 ){
printf("Game Over\n");
}
return 0;
}
整理了一下代码,将循环条件控制为最大输入数量(实际上最多可输入N+1个数),同样通过测试
#include<stdio.h>
int main()
{
int num,N,guess;
int cnt = 0; // 计数结束程序前的数字个数
scanf("%d %d", &num, &N);
scanf("%d", &guess);
while( cnt<=N ){ // 猜测的最大次数前均可输入
cnt ++;
if( cnt>N || guess<0 ){ // 超过N次未猜中或在N次前输入负数则提示“Game Over”,并结束程序
printf("Game Over\n");
break;
}
// 根据猜数的大小关系给出提示
if( guess>num ){
printf("Too big\n");
} else if( guess<num ){
printf("Too small\n");
} else{ // N次内猜到输出结果并结束程序
if( cnt==1 ){
printf("Bingo!\n");
}else if( cnt<=3 ){
printf("Lucky You!\n");
} else if( cnt<=N ){
printf("Good Guess!\n");
}
break;
}
scanf("%d", &guess);
}
return 0;
}