| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1517 人关注过本帖
标题:循环,函数,新手求找错误
只看楼主 加入收藏
lybl
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2017-11-27
结帖率:0
收藏
 问题点数:0 回复次数:5 
循环,函数,新手求找错误
Description
Bob在玩一个积分游戏,游戏由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编辑过]

搜索更多相关主题的帖子: 游戏 分数 字符串 int return 
2018-02-03 11:31
虫眼
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:314
专家分:1121
注 册:2017-11-29
收藏
得分:0 
n=strlen(s); //strlen只有在数组最后一个是'\0'才会得到正确长度
2018-02-07 10:26
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
假设其中一个数据为123456789,其实判断很简单,数的位数越多,数越大,例如以下情况:
1234567+8+9这样得出1234584,比较其他情况如均分等,如下:
123+456+789,可看出,如何加,结果的大小由位数来决定,这里结果最多只能到达4位,于是,第一解设的分法为最优。
因此,每条输入的数据,取最后的2位数字,剩下的为一个数,则得出最大的可能数和。
按此思路不知对否,更没有写码和更多的验证,就只能讨论到这了。
//
补正,假如987654321这样的数,之前的假设才成立,123456789的最好取法是1+2+23456789 =  23456792,因此修正:
判断字符串的头尾1位,比较谁小谁就提取为1个数,操作2次后,剩下的就为可能是最大的整数了。


[此贴子已经被作者于2018-2-7 11:10编辑过]

2018-02-07 11:07
lybl
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2017-11-27
收藏
得分:0 
回复 2楼 虫眼
strncmp函数自动加'\0',strcmp函数连同'\0'一起复制吧
2018-02-07 15:31
虫眼
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:314
专家分:1121
注 册:2017-11-29
收藏
得分:0 
n=strlen(s)  你n值已经出错了,后面程序已经乱了。
2018-02-15 11:30
虫眼
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:314
专家分:1121
注 册:2017-11-29
收藏
得分:0 
另外你在循环里面定义
 while(T--)
    {
        int i,j,n;//i,j表示界限
        int t,ans=-1;
        char s[32],s1[32],s2[32],s3[32];//s1,s2,s3分别为三个小串


编程大忌,这些定义出了循环就作废了。
2018-02-15 11:32
快速回复:循环,函数,新手求找错误
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021681 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved