| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1894 人关注过本帖, 1 人收藏
标题:一道关于二进制的算法题,~~~求实现代码
取消只看楼主 加入收藏
LeslieCh
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2013-11-27
结帖率:77.78%
收藏(1)
已结贴  问题点数:20 回复次数:5 
一道关于二进制的算法题,~~~求实现代码
4122: No_stop玩硬币
Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 268  Solved: 27

Description
No_stop特别喜欢玩硬币, 而且是他只喜欢自己一个人玩。第一次玩,他会把一些硬币排成一排,硬币要么是正面朝上(看成是1)要么是反面朝上(看成0),那么这样会产生一个二进制数(设为数a),No_stop会把它记录下来。他觉得玩一次不过瘾,所以会玩很多次,以后他每次玩会重新拿一些硬币重新排列,他要求每次硬币正面朝上的个数与上一次保持不变,由于他有很强很强的强迫症,他必须让产生数a越来越大,而且要让两次产生的数的差值尽可能小。现在给你No_stop第一次的硬币排列,问你他第二次玩的硬币排列是多少?


Input
第一行输入一个组数T(T<= 30),对于每一组测试数据,输入一个“01”序列(1<=长度<= 10),且 序列的第一个数字不为0。


Output
对于每组测试数据,输出一个“01”序列。


Sample Input
1
1010101

Sample Output
1010110

HINT

Source
Jiong King



搜索更多相关主题的帖子: Memory 强迫症 二进制 而且 记录 
2013-12-18 09:40
LeslieCh
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2013-11-27
收藏
得分:0 
简单的思路是,把产生的二进制数不断加1,知道与上一个二进制数中的1数量相同,,可以要怎么实现呀~~~?求教
2013-12-18 09:41
LeslieCh
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2013-11-27
收藏
得分:0 
我写的错误代码(只有题目测试数据能对,用1,111,100都不对),新人乱写的,求个正确的代码
#include<stdio.h>
#include<string.h>
int main()
{
    int T,j,i,k,q,n,count,recount,flag,w;
    char b[10],a[10];
    scanf("%d",&T);
    getchar();
    for(j=0;j<T;j++)
    {
        gets(b);
        n=strlen(b);
        q=0;count=0;recount=0;
        memset(a,0,sizeof(a));
        for(i=n-1;i>=0;i--)//zhuan zhi
        {
            if(b[i]=='1')
            {count++;}
            a[q]=b[i];
            q++;
        }
        flag=0;
         while(count!=0)
 {
     i=0;
     while(a[i]>='0')//mei ci jia 1
            {
                a[i]+=1;
                if(i>n-1)
                {
                     for(k=0;k<10;k++)
                    {
                        if(a[k]=='1')
                        {recount++;}
                    }
                    if(recount==count)
                    {flag=1;}
                    break;
                }
                if(a[i]>'1')
                {
                    a[i]='0';
                    i++;
                }
                else
                {
                    for(k=0;k<10;k++)//tong ji bu fen
                    {
                        if(a[k]=='1')
                        {recount++;}
                    }
                    if(recount==count)
                    {flag=1;break;}
                }
            }
            if(flag==1)
            {break;}
}
        q=0;
        for(i=9;i>=0;i--)//zhuan zhi
        {
            b[q]=a[i];
            q++;
        }
        for(i=0;i<10;i++)//zhao dao di yi ge '1'
        {
            if(b[i]=='1')
            {w=i;
             break;}
        }
        for(i=w;i<10;i++)//shu chu
        {
            printf("%c",b[i]);
        }
        printf("\n");
    }
    return 0;
}
      
2013-12-18 09:43
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
快速回复:一道关于二进制的算法题,~~~求实现代码
数据加载中...
 
   



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

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