马戈壁,谁能解释一下我代码他妈那里问题!版主出来!

最爱麦丽素 盐城工学院 2014-02-03 06:03:26
一种报数游戏是从1开始连续报数,如果报到7的倍数(7,14,21,28……)或者包含数字7的数(7,17,27,37……)就用拍手代替这个数而不能报出。假设你连续听到m声拍手,问造成你听到m声拍手的第一下拍手所代表的数是几?例如,你听到了两次连续的拍手,最小的可能这两次拍手是27和28,因此输出27。 输入m, 输出这m次连续的拍手第一下所代表的最小可能的数。
#include<stdio.h>
main()
{
int i;
int m=0;
int n;
int b;
for(i=1;i<(1<<31)-1;i++)
{
n=i;
b=0;
while(n%10!=7&&n>0){
n=n/10;
}
if(n!=0)
{
m++;
b=1;
}
if(!b&&i%7==0) {
m++;
b=1;
}
if(!b) m=0;
if(m==1){
printf("%d\n",i-m+1);
break;
}

}
}

代码交上去了,可是!这个到底什么意思,我草,老子代码绝对没问题!!!!
执行测试用例失败!7 解析这组数据出错了:127
...全文
688 点赞 收藏 47
写回复
47 条回复
最爱麦丽素 2014年02月06日
好吧,要结贴了,是本人的失误,还是自己看出来的问题,楼上各位分析的都不对,不是时间问题,也不是算法问题,是一个我根本没有注意到的问题,惭愧啊惭愧,一天之后结贴,100分发给找到我问题的人

提交的代码参看39楼
回复 点赞
最爱麦丽素 2014年02月06日
引用 42 楼 langaishangyang 的回复:
暴力法多数是超时了 可以试下找规律,尝试另外的算法
那这个是什么意思? 执行测试用例失败!7 解析这组数据出错了:127 我还做了几个关于这个的实验,我在最后的print的数据那加一致后,显示的错误是 执行测试用例失败!8 解析这组数据出错了:128 要是减8的话就是 执行测试用例失败!-1 解析这组数据出错了:119 所以百思不得其解啊
回复 点赞
拈花一叶 2014年02月06日
暴力法多数是超时了 可以试下找规律,尝试另外的算法
回复 点赞
拈花一叶 2014年02月06日
number() 函数不用 printf,必须返回值
回复 点赞
最爱麦丽素 2014年02月06日
引用 46 楼 vcf_reader 的回复:
代码绝对有问题
你说的真好!
回复 点赞
vcf_reader 2014年02月06日
代码绝对有问题
回复 点赞
xwj 2014年02月05日
肯定是代码有问题,机器不会骗人
回复 点赞
最爱麦丽素 2014年02月05日
引用 40 楼 ForestDB 的回复:
LZ给个原题的链接吧。
题目链接:http://hero.csdn.net/OnlineCompiler/Index?ID=237&ExamID=232&from=0
回复 点赞
ForestDB 2014年02月05日
LZ给个原题的链接吧。
回复 点赞
最爱麦丽素 2014年02月05日
引用 37 楼 langaishangyang 的回复:

#include<stdio.h>
int number (int m)
{
    int i;
    int x=0;
    int n;
    int b;
    for(i=1;i<(1<<31)-1;i++)
    {
        n=i;
        b=0;
        while(n%10!=7&&n>0){
            n=n/10;
        }
        if(n!=0) 
        {
            x++;
            b=1;            
        }
        // if(!b&&i%7==0) { // 貌似这里也错了
        if(b==0 &&i%7==0) { 
            x++;
            b=1;
        }
        //if(!b) x=0; //楼主代码的逻辑错了
        if(b==0) x=0; 
        if(x==m){
            printf("%d\n",i-x+1);
            break;
        }
  
    }
  
    return 0;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{    
    printf("%d",number(11));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
2个地方逻辑错误,转成 C# 运行了一下, m = 2, output : 27 m = 7, output : 70 m = 11, output : 270 注意第二个sample, 从 70开始其实可以连续拍手10次, 代码输出的是 连续拍手次数 大于等于 m ,并非仅 等于 m
那m等于3时难道要输出未找到么?当我听到连续三声的时候明明就可以判断最低数为70啊,题目不是这个意思
回复 点赞
最爱麦丽素 2014年02月05日
引用 36 楼 langaishangyang 的回复:
[quote=引用 34 楼 l786112323 的回复:] [quote=引用 32 楼 langaishangyang 的回复:] 暂且这么理解楼主的代码: int i;//循环变量 int x=0;//连续拍手次数 int n; //要处理的数字 int b; //1:拍手,0:不拍手 补充: 1. b 可以 bool 值,不必用 int 浪费 2. if (b != 0) x = 0; // b == 0 x才置0, 表示拍手次数从头计
C里没有bool,我编译的时候是这么告诉我的[/quote] 那还是用 int ,重点在第2点,改一下逻辑 PS: 手上没有 C 语言编译器,目测以下代码应该能通过
 
#include<stdio.h>
int number (int m)
{
    int i;
    int x=0;
    int n;
    int b;
    for(i=1;i<(1<<31)-1;i++)
    {
        n=i;
        b=0;
        while(n%10!=7&&n>0){
            n=n/10;
        }
        if(n!=0) 
        {
            x++;
            b=1;            
        }
        if(!b&&i%7==0) {
            x++;
            b=1;
        }
        //if(!b) x=0; //楼主代码的逻辑错了
        if(b==0) x=0; 
        if(x==m){
            printf("%d\n",i-x+1);
            break;
        }
 
    }
 
    return 0;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{    
    printf("%d",number(11));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
[/quote]哥哥,逻辑没问题!运行不出错,是结果错了
回复 点赞
拈花一叶 2014年02月05日

#include<stdio.h>
int number (int m)
{
    int i;
    int x=0;
    int n;
    int b;
    for(i=1;i<(1<<31)-1;i++)
    {
        n=i;
        b=0;
        while(n%10!=7&&n>0){
            n=n/10;
        }
        if(n!=0) 
        {
            x++;
            b=1;            
        }
        // if(!b&&i%7==0) { // 貌似这里也错了
        if(b==0 &&i%7==0) { 
            x++;
            b=1;
        }
        //if(!b) x=0; //楼主代码的逻辑错了
        if(b==0) x=0; 
        if(x==m){
            printf("%d\n",i-x+1);
            break;
        }
  
    }
  
    return 0;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{    
    printf("%d",number(11));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
2个地方逻辑错误,转成 C# 运行了一下, m = 2, output : 27 m = 7, output : 70 m = 11, output : 270 注意第二个sample, 从 70开始其实可以连续拍手10次, 代码输出的是 连续拍手次数 大于等于 m ,并非仅 等于 m
回复 点赞
拈花一叶 2014年02月05日
引用 34 楼 l786112323 的回复:
[quote=引用 32 楼 langaishangyang 的回复:] 暂且这么理解楼主的代码: int i;//循环变量 int x=0;//连续拍手次数 int n; //要处理的数字 int b; //1:拍手,0:不拍手 补充: 1. b 可以 bool 值,不必用 int 浪费 2. if (b != 0) x = 0; // b == 0 x才置0, 表示拍手次数从头计
C里没有bool,我编译的时候是这么告诉我的[/quote] 那还是用 int ,重点在第2点,改一下逻辑 PS: 手上没有 C 语言编译器,目测以下代码应该能通过
 
#include<stdio.h>
int number (int m)
{
    int i;
    int x=0;
    int n;
    int b;
    for(i=1;i<(1<<31)-1;i++)
    {
        n=i;
        b=0;
        while(n%10!=7&&n>0){
            n=n/10;
        }
        if(n!=0) 
        {
            x++;
            b=1;            
        }
        if(!b&&i%7==0) {
            x++;
            b=1;
        }
        //if(!b) x=0; //楼主代码的逻辑错了
        if(b==0) x=0; 
        if(x==m){
            printf("%d\n",i-x+1);
            break;
        }
 
    }
 
    return 0;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{    
    printf("%d",number(11));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
回复 点赞
baichi4141 2014年02月05日
以前做OJ题的时候,记得有一道题运算量极大,对算法要求很高,大家都卡在超时上 但那道题实际上只有一个测试用例,即只有一个输入只需要一个输出 结果大家都是在自己电脑上跑一段时间得出那个输出结果,然后提交一个直接输出该结果的小程序,照样通过
回复 点赞
baichi4141 2014年02月05日
我明白了,楼主以为自己交上去的代码有人看有人改m值? 不是这样的,OJ系统只提供标准输入并判断程序的输出结果,你交上去的代码它直接编译运行,不会看里面的任何东西,所以你提供if一点意义都没有,你应该scanf从标准输入读取m值 我还以为楼主这段代码是解释自己思路的,没想到楼主提交的就是这段代码,这肯定不行啊,系统哪管你代码每一段是啥意思,它只看程序运行时的输入输出
回复 点赞
最爱麦丽素 2014年02月05日
拜托各位大神,把我的代码复制下去,看看输出有没有什么问题,不行就用我的代码也去挑战一下,看一下哪个测试用例错了,或者有哪位高人挑战成功了,恳请您把代码借我参考一下qq786112323
回复 点赞
最爱麦丽素 2014年02月05日
引用 32 楼 langaishangyang 的回复:
暂且这么理解楼主的代码: int i;//循环变量 int x=0;//连续拍手次数 int n; //要处理的数字 int b; //1:拍手,0:不拍手 补充: 1. b 可以 bool 值,不必用 int 浪费 2. if (b != 0) x = 0; // b == 0 x才置0, 表示拍手次数从头计
C里没有bool,我编译的时候是这么告诉我的
回复 点赞
拈花一叶 2014年02月05日
引用 31 楼 langaishangyang 的回复:
#Line 27 : if(!b&&i%7==0) 有问题,i%7==0 成立就可以拍手了
sorry, 理解错了, 这样可能清晰一些
  if (n != 0)
                {
                   // x++;
                    b = true;
                }
                if ( i % 7 == 0)
                {
                    //x++;
                    b = true;
                }
                if (!b) x = 0;
                else x++;
回复 点赞
拈花一叶 2014年02月05日
暂且这么理解楼主的代码: int i;//循环变量 int x=0;//连续拍手次数 int n; //要处理的数字 int b; //1:拍手,0:不拍手 补充: 1. b 可以 bool 值,不必用 int 浪费 2. if (b != 0) x = 0; // b == 0 x才置0, 表示拍手次数从头计
回复 点赞
拈花一叶 2014年02月05日
#Line 27 : if(!b&&i%7==0) 有问题,i%7==0 成立就可以拍手了
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告