1013Harvest
我用的是C语言来完成的,其实用指针可能会方便一些,鉴于不太会用指针,所以我避开了这个知识点。
我在思路上碰到的一些小坎坷:
1、搞不清楚轻重:
一定要知道不论是高还是低,都是按照右边的秤而言的,如果左边秤中某一美元有问题,秤相对高,就说明,左边秤有问题的美元偏重。
2、漏用条件:
很难表达,例子来凑:
ABCDEF GHIJKL up
ABC DEF even
I J down
仔细推算,这组数据I偏轻,但是真的用程序运行,给出的结果很有可能是GHIKL偏轻,当然也有的人是G偏轻。先不看结果是否正确,GHIKL偏轻确实符合这三个例子的要求。这样说,可能就发现问题了,GHKL偏轻确实符合要求,但是如果这样的话,第三个例子就没有用到了。
以上为在思路上碰到的问题。
我编写程序碰到的一些小坎坷:
1、读入数据:
(1)字符串中空格后的数据都读不进去,因而左边、右边以及结果需要分开读入;
(2)最好用 memset 把数据清0,避免读取错误;
(3)开数组的时候要注意数据大小,不要只看到例子中给定的数据大小,这道题的读入数据有大有小,并不固定。
2、读取给定样例中左边或右边有多少字符:
数组开的是二维数组。
以上为编写程序遇到的问题。
#include<stdio.h>
#include<string.h>
int m[3];//读取每行左边或右边美元个数
int num[13];
char r[3][13];
char l[3][13];
char res[3][5];
int sflag(int i);
int main()
{
int i,j,k,h;
int flag;
scanf("%d",&k);
for(h=0; h<k; h++)
{
memset(m,0,sizeof(m));
memset(num,0,sizeof(num));
memset(r,'0',sizeof(r));
memset(l,'0',sizeof(l));
memset(res,'0',sizeof(res));
for(i=0; i<3; i++)//输入相应字符串
{
scanf("%s",l[i]);
scanf("%s",r[i]);
scanf("%s",res[i]);
}
for(i=0; i<3; i++)//每一行有多少个字符
{
j=0;
while(l[i][j]>='A'&&l[i][j]<='L')
{
m[i]++;
j++;
}
}
for(i=0; i<3; i++)//找出可能有问题的字符
{
if(res[i][0]=='e')
{
for(j=0; j<m[i]; j++)
{
num[l[i][j]-'A']=1;
num[r[i][j]-'A']=1;
}
}
if(res[i][0]=='u'||res[i][0]=='d')
{
for(j=0; j<m[i]; j++)
{
if(num[l[i][j]-'A']!=1)
num[l[i][j]-'A']=2;
if(num[r[i][j]-'A']!=1)
num[r[i][j]-'A']=2;
}
}
}
for(i=0; i<13; i++)
{
if(num[i]==2)
{
flag=sflag(i);
if(flag==1)
{
printf("%c is the counterfeit coin and it is heavy.\n",'A'+i);
}
if(flag==0)
{
printf("%c is the counterfeit coin and it is light.\n",'A'+i);
}
}
}
}
return 0;
}
int sflag(int i)
{
int count,count1,count2;
int j,a;
count=count1=count2=0;
int flag=2;
for(j=0; j<3; j++)
{
if(res[j][0]!='e')
count++;
for(a=0; a<m[j]; a++)
{
if(r[j][a]=='A'+i)
{
if(res[j][0]=='d')
{
count1++;
break;
}
if(res[j][0]=='u')
{
count2++;
break;
}
}
if(l[j][a]=='A'+i)
{
if(res[j][0]=='u')
{
count1++;
break;
}
if(res[j][0]=='d')
{
count2++;
break;
}
}
}
}
if(count1==count)
flag=1;
if(count2==count)
flag=0;
return flag;
}
写的比较繁琐,但是容易理解。有什么问题的话希望大家能够指出来,谢谢啦。