1)按题目应该是k=10000,而不是1000,在这里因为直接用int计算10000会溢出,所以令k=1,最后打印的时候再加上4个零。
2)整个计算过程都没有用到读入的a的值,即题目中规定可以生的孩子数M。我估计你的
if(i>b)
p=i;
这里,应该是用i>a判断。
3)没有考虑罚款为零的情况,即N小于M且没有生过男孩后在生。所以p的初值修改为b。
4)没有考虑允许生的孩子数是零的情况,即M=0。所以这里将if(i>a)判断往前移。
5)在生的孩子数多于M或者生了男孩后,给p赋值,在需不需要减一上,似乎错了。
以下是在你的基础上改的AC代码
#include<stdio.h>
int main()
{
//freopen("in.txt", "r", stdin);
int a,b,i,k,p,s,t,f[100];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&b);
for(i=1;i<=b;i++)
scanf("%d",&f[i]);
p=b; // 没有违规
for(i=1;i<=b;i++)
{
if(i>a) // 超过了允许生的数量M
{
p=i-1;
break;
}
if(f[i]==1) // 生了一个男孩
{
p=i;
break;
}
/*if(i>b)
p=i;*/
}
s=0;
k=1;
for(i=1;i<=(b-p);i++)
{
s+=k;
k*=2;
}
if (!s)
printf("0 RMB\n");
else
printf("%d0000 RMB\n",s);
}
return 0;
}
输入不要这么写gets(a)!=EOF 写成gets(a)就好~
另外这一句if(!isalpha(a[j-1])&&(a[j-1]!='\'')&&isalpha(a[j])&&j!=0)有很多错误
首先,当j=0的时候,a[j-1]会造成访问越界,所以这一句if前面要加一个else。这样在处理了第一个 if(isalpha(a[0])) 之后就不会再访问这个if了~(你这一句把j!=0放在最后是不行的,有的编译器如果是从左至右判断的话,肯定会造成越界错误)
a[j-1]!='\''是什么意思,判断是不是单引号?你都isalpha了还判断这个干啥?删了~
for(i=1;i<=n;i++) //输入n个数据
{
scanf("%d",&a[i]);
if(a[i]>m) //每输入一个数据就进行判断 如果m小 将输入的数据推后一个 m占当前位置
{
t=a[i];
a[i]=m;
a[i+1]=t;
i++;
}
if里面有个i++ . for(i = 1 ;i < = n ;i ++) 这里也有个i ++
也就是当输入的值大于m的时候,你相当于输入了二个值,比所需要的少一个。而且你的交换也写错了。 a[i + 1 ] = t ? ,
不信的话,你可以试试,