首页
社区
课程
招聘
[求助]c语言“玄学”,求助
发表于: 2018-11-6 10:43 4574

[求助]c语言“玄学”,求助

2018-11-6 10:43
4574
先上题目和代码(写的有点渣)


那个for(k=0;k<n;k++)//while(n--)就是出问题的地方
我用for循环,就通过了。用while循环,网站就提示错误答案。但是两者的确是同一个效果,都是循环n次

有谁知道原因吗???听说是itoa的原因

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-11-6 10:45 被Lixinist编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (11)
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
2
#include<stdio.h>
#include<string.h>
#include<cstdlib>
int main()
{
       int n,i;
       long long goin;
       char a[2];
       int k;
       scanf("%d",&n);
       
       for(k=0;k<n;k++)//while(n--)
       {
               int jishu=0,jishu2=0;
               char bin[33];
               strcpy(bin,"00000000000000000000000000000000");
               scanf("%I64d",&goin);
               
               itoa(goin,bin,2);//将输入的十进制数转成二进制,存到bin数组里面
               
               for(i=0;i<32;i++)//不断循环取每个字符(0-31号)
               {
                       
                       strncpy(a,bin+i,1);
                       if(strcmp(a,"1")==1)
                       {
                               jishu++;
                               if(i==31)
                               {
                                       goto x;
                               }
                       }
                       else
                       {
                       x:        if(jishu>jishu2)
                               {
                                       jishu2=jishu;
                               }
                               jishu=0;//临时计数清零
                       }

               }
               printf("%d\n",jishu2);
       }
       
}
2018-11-6 10:47
0
雪    币: 278
活跃值: (1017)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
你的代码中有个根本性的错误,strcmp(a,"1")==1是错的,因为strcmp操作数相等时返回0,应该改为strcmp(a,"1")==0。其次是第二个for循环i<32不合适,因为itoa后bin的长度strlen(bin)不是32。改成int len=strlen(bin), .....,i<len,.....,i==len-1。最后是算法不够高效,直接求余数与1比较会更快
2018-11-6 11:43
0
雪    币: 12045
活跃值: (4763)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
C语言,最头痛的语言
2018-11-6 12:32
0
雪    币: 278
活跃值: (1017)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5

给个参考:

#include <stdio.h>

int main()
{
    int k=0;
    scanf("%d",&k);
    while(k--)
    {
        int n=0;
        int saveCount = 0;
        int count = 0;
        scanf("%d",&n);
        while(n>0)
        {
            if(n&0x1)
            {
                ++count;
            }
            else
            {
                if(count > saveCount)
                {
                    saveCount = count;
                }
                count = 0;
            }
            n >>=1;

            if(n == 0)
            {
                if(count > saveCount)
                {
                    saveCount = count;
                } 
            }
        }
        printf("%d\n",saveCount);
    }       
}
2018-11-6 14:14
0
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
6
.
最后于 2018-11-6 16:52 被Lixinist编辑 ,原因: 之后调试发现是自己问题
2018-11-6 16:07
0
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
7
青史无疆 你的代码中有个根本性的错误,strcmp(a,"1")==1是错的,因为strcmp操作数相等时返回0,应该改为strcmp(a,"1")==0。其次是第二个f ...
先感谢指导。
最后于 2018-11-6 16:53 被Lixinist编辑 ,原因: strcmp相等,的确是返回0。之前是自己写错了
2018-11-6 16:07
0
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
8
青史无疆 你的代码中有个根本性的错误,strcmp(a,"1")==1是错的,因为strcmp操作数相等时返回0,应该改为strcmp(a,"1")==0。其次是第二个f ...
我刚才又拿strncmp试了一下,这个函数相等时就返回了0
2018-11-6 16:31
0
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
9
我把strcmp的用法纠正过来了,while和for循环就都可以通过了。不过还是想不通,strcmp用错时,为什么会出现用for循环能通过,用while循环却不通过
2018-11-6 17:33
0
雪    币: 848
活跃值: (1262)
能力值: ( LV7,RANK:118 )
在线值:
发帖
回帖
粉丝
10
这里面用goto语句,还这么用,这倒是第一次见
2018-11-6 23:39
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11

最后于 2018-11-11 14:15 被哈士奇去上学编辑 ,原因:
2018-11-11 14:14
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12

hello

#include <iostream>
#include <cstdint>     //for uint32


int foo(uint32_t n)
{
    int maxcnt = 0;     //保存之前的最大bit1连续个数
    int curcnt = 0;     //保存当前bit1连续个数

    for (int i = 0; i < 32; ++i)    //右移并测试
    {
        if (n & 0x01)   //当前最低位是否为1
        {
            curcnt++;
        }
        else
        {

            if (curcnt > maxcnt)
                maxcnt = curcnt;
            curcnt = 0;
        }

        n >>= 1;
    }
    return maxcnt;

}



int main()
{
    uint32_t  n;

    int k;
    std::cin >> k;
    while (k--)
    {
        std::cin >> n;
        std::cout << foo(n) << std::endl;
    }

    /*std::cin.get();
    std::cin.get();*/


}
2018-11-11 14:15
0
游客
登录 | 注册 方可回帖
返回
//