题目:我们用0表示林丹,1表示李宗伟。 输入数据中每行会给出一个0或者1,表示对应选手得1分。 当一方得分达到21分时,只要该方与对方分差超过1分,该方即胜出。 你需要输出最后获胜选手的代号。
输入:若干行每行一个0或者1。
输出:一行一个0或者1表示胜者。
代码如下:
#include<stdio.h>
#include<math.h>
int main(){
int a,b,c;
b=0;
c=0;
while ((b<21&&c<21)||fabs(b-c)<2)
{scanf("%d\n",&a);
if(a==1){
b++;
}
else
c++;
}
if(b>c)
printf("1\n");
else
printf("0\n");
return 0;}
在这里或许有一点不理解的是||
这个逻辑判断符在语句里面是指,任意满足这两个中的任何一个,都会继续循环。
要改写成for语句的话,主要后面那个条件要重新写,很容易出错
就像我一开始居然打算对分差没超过2的情况分类讨论,很自然的会有漏掉的情况
教训就是,在写代码里如若有可用的条件不要选择枚举,让计算机帮你分类。
这也就是之后递归回溯的一种思想!!!
错误代码:(感觉自己毫无逻辑,别看了唉)
#include<stdio.h>
#include<math.h>
int main(){
int a,b,c;
b=0;
c=0;
while (b<21&&c<21)
{scanf("%d\n",&a);
if(a==1)
b++;
else
c++;}
if(b=21&&c<20)
printf("1\n");
else if(c=21&&b<20)
printf("0\n");
else{while(fabs(b-c)==1)
{scanf("%d\n",&a);
if(a==1)
b++;
else
c++;}
if(b>c)
printf("1\n");
else
printf("0\n");}
return 0;}