循环,函数,新手求找错误
DescriptionBob在玩一个积分游戏,游戏由3轮组成。每一轮都可以获得一个不小于零且不大于10^6的积分奖励,游戏完成后,Bob的积分是三轮游戏的分数和。本来应该是机器自动计算后给Bob发放奖励,但是由于机器故障,机器记录的三次分数中间没有任何间隔,工作人员检查后表示暂时无法修复,如果想要现在领取奖励,需要自己将3次分数告诉他,Bob忘记了他每轮的分数,但是想现在就得到奖励。为了得到更多的积分奖励,Bob向你发出求助,你能帮他计算出他能获得的最大分数吗?
Input
多组测试,首先输入进行的游戏次数n(n<10),接下来n行每行包括一个长度不超过30个字符的字符串。保证输入的字符只包含数字。一句字符串代表该轮游戏机器人记录的三次分数,三次分数之间没有间隔。
Output
输出Bob在该轮能获得的最大奖励分数,如果无法得到最大奖励,则输出-1。注意:结果可能超出int范围,每轮成绩不能有前导0。
Sample Input
3
1234
0009
9991
Sample Output
37
-1
109
HINT
1234分解为1,2,34 所以结果为37
0009无法分解成三个不包含前导零的数,所以结果为-1
我的思路:
用两重循环作为界限,将字符串分成三个小字符串。判断小字符串是否符合题意,再转化为数字,相加即可。
#include <stdio.h>
#include <string.h>
int isLegal(char *s);//判断字符串是否符合题意
int Switch(char *s);//将字符串转化为数字
int main()
{
int T;
scanf("%d",&T);
getchar();
while(T--)
{
int i,j,n;//i,j表示界限
int t,ans=-1;
char s[32],s1[32],s2[32],s3[32];//s1,s2,s3分别为三个小串
gets(s);
n=strlen(s);
if(n>2&&n<22)
{
for(i=1;i<8&&i<n-1;i++)
{
strncpy(s1,s,i);
if(isLegal(s1))
{
for(j=1;j<8&&i+j<n;j++)
{
strncpy(s2,s+i,j);
if(isLegal(s2))
{
strcpy(s3,s+i+j);
if(isLegal(s3))
{
t=Switch(s1)+Switch(s2)+Switch(s3);
ans=ans>t?ans:t;
}
}
}
}
}
}
printf("%d\n",ans);
}
return 0;
}
int isLegal(char *s)
{
int n=strlen(s);
if(n==0)
return 0;
else if(n==1)
return 1;
else
{
if(*s=='0')
return 0;
else if(n<7)
return 1;
else if(n==7)
return (!strcmp(s,"1000000"));
else
return 0;
}
}
int Switch(char *s)
{
int i,t=0;
for(i=0;*(s+i)!='\0';i++)
t=t*10+*(s+i)-'0';
return t;
}
[此贴子已经被作者于2018-2-3 11:39编辑过]