| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1894 人关注过本帖, 1 人收藏
标题:一道关于二进制的算法题,~~~求实现代码
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
挺好,只当是交流一下编码心得吧。
程序代码:
#include<stdio.h>
#include<string.h>
int main()
{
    char a[16];
    int t, i, j;
    for(scanf("%d", &t); t--; puts(i ? a + 1 : a))
    {
        a[0] = '0';
        scanf("%s", a + 1);
        for(j = i = strlen(a) - 1; i && a[i] == '0'; i--);
        for(; a[i - 1] == '1'; a[i--] = '0', a[j--] = '1');
        a[i--] = '0';
        a[i] = '1';
    }
    return 0;
}

重剑无锋,大巧不工
2013-12-19 14:50
犬虫门心本人
Rank: 2
等 级:论坛游民
帖 子:28
专家分:26
注 册:2013-12-19
收藏
得分:0 
回复 2楼 LeslieCh
求教两个问题:
1、输入的是以字符串形式的数据么?
2、如果没有结果,允许输出“无解”么?
2013-12-19 15:04
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 11楼 beyondyf
牛,合并到一个循环中
2013-12-19 15:23
LeslieCh
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2013-11-27
收藏
得分:0 
以下是引用rjsp在2013-12-18 10:22:20的发言:

我来教你一个排序组合的算法吧,也就是std::next_permutation算法的简化:

先读入“01”序列,并在最前面补上一个0,得到 0abcdefghij
从后向前遍历,找到第一个1的位置i,并把a设为0
从i-1向前遍历,找到第一个0的位置j,并把a[j]设为1
将j之后的序列反序一下
多谢大神的相助~~帮了我大忙啊
我是新人,目前还没学过一个具体的算法,能告诉我这样的思路是怎么出来的吗?

如果按我原来的想法,将01序列反序后,从i=0开始a[i]加1,a[i]超过1就赋值为0,i+1继续此操作。。。。当i超过原序列的最后一个字符下标后又从i=0开始,每次加1后统计整个序列中1的个数,与原来相同则退出循环。。。
这样的思路用代码行得通吗?
2013-12-19 19:11
LeslieCh
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2013-11-27
收藏
得分:0 
回复 12楼 犬虫门心本人
不懂哎,反正我是用字符串考虑的。
应该是考虑有解的情况。。。
2013-12-19 19:14
LeslieCh
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2013-11-27
收藏
得分:0 
以下是引用beyondyf在2013-12-19 14:50:17的发言:

挺好,只当是交流一下编码心得吧。
#include
#include
int main()
{
    char a[16];
    int t, i, j;
    for(scanf("%d", &t); t--; puts(i ? a + 1 : a))
    {
        a[0] = '0';
        scanf("%s", a + 1);
        for(j = i = strlen(a) - 1; i && a == '0'; i--);
        for(; a1] == '1'; a = '0', a[j--] = '1');
        a = '0';
        a = '1';
    }
    return 0;
}
多谢版主交上去AC啦~
但我用ChIDE运行试了一下
输入
1
1010101
为什么会出现这样的结果?
1
10101
ERROR: array length in scanf(), fscanf() or sscanf() is too small
       at line 10 in file C:\Users\Administrator\Desktop\qq.ch
WARNING: subscript value -1 less than lower limit 0
         at line 12 in file C:\Users\Administrator\Desktop\qq.ch
WARNING: subscript value -1 less than lower limit 0
         at line 14 in file C:\Users\Administrator\Desktop\qq.ch

上面是没有运行结果输出来的,但在OJ上过了。。。
2013-12-19 19:36
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
你复制错了。
2013-12-19 21:28
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:0 
这个真心要学习了
算法是俺心中永远的痛。。。
2013-12-26 10:50
mic123
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:22
专家分:123
注 册:2013-12-23
收藏
得分:0 
最后那个反转不明白,
  如果这个数是  10101001
  按照rjsp给出的的算法  是不是就是  01010110  
  这个数是不是比给定的数小,不知道我理解的对不对?
2013-12-26 16:23
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
10101001 交换后得到 10101010
然后反转 10101010,而不是 10101010
2013-12-26 16:41
快速回复:一道关于二进制的算法题,~~~求实现代码
数据加载中...
 
   



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

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