这两天在做蓝桥杯的基础练习时发现有几道题真的挺难的,一个是数的读法,要考虑的情况真的很多,一个是芯片测试,题意简洁,看完人就很迷了,觉得无从下手。
先说说数的读法,这题之前可能是见过类似的,所以动手写了小一个小时,最后试着试着就发现太复杂了,然后就去网上搜了下,在csdn上发现一个特简洁的代码,一测果然AC了,想着又是那位大牛写的,短短20几行代码就过了,仔细一读代码发现有些不对呀,果然,拿着题目里的两个数据,10010和10000试了下结果都不对。
//参考博客https://blog.csdn.net/JYL1159131237/article/details/78631962的代码
#include
#include
int main()
{
char a[100];
int i,j,l;
char b[20][10]= {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char c[20][10]= {"","","shi","bai","qian","wan","shi","bai","qian","yi","shi"};
gets(a);
l=strlen(a);
for(i=0; i<l; i++)
{
j=a[i]-'0';
if(j==0)
{
if(i<l-1)
if(a[i+1]!='0')//下一位不为0
printf("%s ",b[j]);
}
else if((l-i==2||l-i==6||l-i==10)&&j==1)//shi
printf("%s ",c[l-i]);
else if(a[i-1]=='0'&&j==1)
printf("%s ",c[l-i]);
else
printf("%s %s ",b[j],c[l-i]);
}
printf("\n");
return 0;
}
是的,就题目中给的2个数都不对,但是最后提交上去AC了 ̄□ ̄||
本着瞎折腾的精神,把代码修改了下(经评论区指正,下述代码修正了输入0时返回空的问题,但仍存在输入1000000时输出错误的问题),试了下上面2个都是对的,提交上去也AC了
using namespace std;
#include
int main()
{
char a[100];
int i,j,l;
char b[20][10]= {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char c[20][10]= {"","","shi","bai","qian","wan","shi","bai","qian","yi","shi"};
gets(a);
l=strlen(a);
if(a[0] == '0' && l==1) printf("%s",b[0]);
for(i=0; i<l; i++)
{
j=a[i]-'0';
if(j==0)
{
if(i<l-1)
if(a[i+1]!='0')//下一位不为0
printf("%s ",b[j]);
}
else if((l-i==2||l-i==6||l-i==10) && j==1 && a[i+1]!='0' && i==0)//shi
printf("%s ",c[l-i]);
else if((l-i==2||l-i==6||l-i==10) && j==1 && a[i+1]=='0' && i==0)//shi +
printf("%s %s",c[l-i],c[l-i-1]);
else
printf("%s %s ",b[j],c[l-i]);
}
printf("\n");
return 0;
}
问题主要出在2个地方,一个是10到底读shi 还是yi shi,仔细思考发现,只有100000,10,1000000000,这种以10开头的才读shi 其他前面有数字的都读yi shi 比如10010,210,22101210这种;另一个就是原代码里面对100000这种数字只输出了shi 却没有输位权,在符合输出shi的情况只有在当前位为1,下一位不为0是才能直接输shi , 否则的话一定要输出shi + 位权。
无独有偶,另一个芯片测试也是这样,读完题觉得没找到规律啥的,就先自己瞎试了下,既然好芯片测结果是正确的,那么如果i测j是1,j测i也是1的话不就说明i和j都是好的嘛(实际上这逻辑一点都不通,╮(╯▽╰)╭)
using namespace std;
#include
int main(){
int n,i,j;
int mp[25][25];
cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>mp[i][j];
}
}
bool flag[25]={0};
//60
for(i=1;i<=n-1;i++)
{
for(j=i+1;j<=n;j++)
{
if(mp[i][j] == 1 && mp[j][i] == 1)
{
flag[i]=1;
flag[j]=1;
break;
}
}
}
for(i=1;i<=n;i++)
{
if(flag[i]) cout<<i<<" ";
}
return 0;
}
最后提交上去居然还有60分O(∩_∩)O哈哈~,这告诉我们不会的题目瞎试试也能拿分呢,不能轻易放弃!
最后上网一搜发现真的有人和我同一情况呢,参考博客
https://blog.csdn.net/chensanwa/article/details/75388827
这位博主也是很有趣呢,看完测试案例后发现只要根据最后一行是不是1就可以直接输出了,果断地去试了下发现居然是真的,蓝桥杯这测试案例真的是太有趣了hhh
严肃起来,仔细看了下,博主后面也写了正常的解题思路,在题目中已经说明好的芯片比坏的多,那只要对j列来说,若j列内的1比0多不就说明j号芯片是好的嘛
直接上代码
using namespace std;
#include
int main(){
int n,i,j;
int mp[25][25];
cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>mp[i][j];
}
}
bool flag[25]={0};
//60
// for(i=1;i<=n-1;i++)
// {
// for(j=i+1;j<=n;j++)
// {
// if(mp[i][j] == 1 && mp[j][i] == 1)
// {
// flag[i]=1;
// flag[j]=1;
// break;
// }
// }
// }
//100 钻漏洞
// for(i=1;i<=n;i++)
// {
// if(mp[n][i] == 1) flag[i]=1;
// }
//100 正经点
for(i=1;i<=n;i++)
{
int cnt=0;
for(j=1;j<=n;j++)
{
if(mp[j][i] == 1) cnt++;
}
if(cnt>n/2) flag[i]=1;
}
for(i=1;i<=n;i++)
{
if(flag[i]) cout<<i<<" ";
}
return 0;