| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1091 人关注过本帖
标题:花了3天时间还是解不出来~求高手指教
只看楼主 加入收藏
ccapp
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2009-10-23
收藏
得分:0 
哈哈 多谢楼上的  我居然忽略了直接用printf  一直想着要用什么公式~~~   这样如果是单独输出无限循环简易多了     不过还是解决不了 从Bbit中找出所有包括Abit的值
2009-10-23 12:58
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
真讨厌真讨厌……写C的输出32位binary值很麻烦的……这不可能不用数组和递归……

程序代码:
#include <stdio.h>
#include <stdlib.h>

#define A 0xAAAAAAAA

char *bv(char *buf, size_t bufsize, unsigned int n, int wide)
{
    char *last = &buf[bufsize];
    *last = '\0';
    while (wide <= 0 ? n : wide--)
    {
        *--last = '0' + (n & 1);
        n >>= 1;
    }
    return last;
}

int main(void)
{
#define BUFSIZE 33
#define bv(c, wide) bv(buf, BUFSIZE, (c), (wide))

    char buf[BUFSIZE];
    int a, b;

    while (scanf("%d%d", &a, &b) == 2)
    {
        int n = 0, bn = 1, orig_n, orig_bn;
        while (n < b - a + 1)
        {
            int c = 0, cc = b - n - a;

            orig_n = n;
            orig_bn = bn;

            while (n > 0)
            {
                int d;
                for (d = 0; d < bn; ++d)
                {
                    printf("%s", bv(c, cc));
                    printf("%s", bv(A >> (32 - a), -1));
                    printf("%s\n", bv(d, n));
                }
                n -= 1;
                bn >>= 1;
                c = (c << 1) | 1;
                cc += 1;
            }
            printf("%s", bv(c, cc));
            printf("%s\n", bv(A >> (32 - a), -1));
            n = orig_n + 1;
            bn = orig_bn << 1;
        }
    }
    return 0;
#undef bv
#undef BUFSIZE
}



专心编程………
飞燕算法初级群:3996098
我的Blog
2009-10-23 15:19
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
只靠位运算,一个long型是够的,可以输出结果了,但对输入大点的位数,我的方法出来的结果就慢了。我再想想。
程序代码:
#include <stdio.h> 
 
void dat(long n,int b) 
{ 
 int i; 
 for(i=b-1;i>=0;i--) 
   { 
    printf("%d",(n>>i)&1); 
   } 
 printf("\n"); 
} 
 
int main(void) 
{ 
    int a,b,i; 
    long m=0x55555555,x,y=0,z; 
    do{ 
       printf("input b:"); 
       scanf("%d",&b); 
       printf("input a:"); 
       scanf("%d",&a); 
      }while(b>31 || a>b); 
 
    for(i=0;i<a;i++) 
      { 
       y<<=1; 
       y^=m&1; 
       m>>=1; 
      } 
 
    for(i=0,z=0;i<b;i++) 
      { 
       z<<=1; 
       z^=1; 
      } 
    m=0x7FFFFFFF>>(31-a); 
    for(x=y;x<z;x==y?x<<=1:x++) 
      { 
       for(i=0;i<=b-a;i++) 
     { 
      if((x&m)==y){dat(x,b);break;} 
      y<<=1; 
      m<<=1; 
     } 
       y>>=i; 
       m>>=i; 
      } 
 
    return 0; 
} 


努力—前进—变老—退休—入土
2009-10-23 15:37
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
额……我的是构造法,UseYuH的是筛法……

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-10-23 15:44
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
我上面的代码用了数组了。

实在不行可以猥琐点,不就是32位么?直接四个int搞定,写成宏……

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-10-23 15:45
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
我的编译器int是16位的,所以要long长整型,我看下你的构造法。

努力—前进—变老—退休—入土
2009-10-23 15:54
ccapp
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2009-10-23
收藏
得分:0 
以下是引用UserYuH在2009-10-23 15:37:03的发言:

只靠位运算,一个long型是够的,可以输出结果了,但对输入大点的位数,我的方法出来的结果就慢了。我再想想。
#include <stdio.h>
 
void dat(long n,int b)
{
 int i;
 for(i=b-1;i>=0;i--)
   {
    printf( ...
多谢~不过我测试了一下     当b等于31的时候就无法正常列出结果哦
2009-10-24 02:21
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:8 
那是因为算到最高位变成负数了,改下循环判断就行了。或加一条判断。
程序代码:
#include <stdio.h> 
 
void dat(long n,int b) 
{ 
int i; 
for(i=b-1;i>=0;i--) 
   { 
    printf("%d",(n>>i)&1); 
   } 
printf("\n"); 
} 
 
int main(void) 
{ 
    int a,b,i; 
    long m=0x55555555,x,y=0,z,n1,n2; 
    do{ 
       printf("input b:"); 
       scanf("%d",&b); 
       printf("input a:"); 
       scanf("%d",&a); 
      }while(b>31 || a>b); 
 
    for(i=0;i<a;i++) 
      { 
       y<<=1; 
       y^=m&1; 
       m>>=1; 
      } 
 
    for(i=0,z=0;i<b;i++) 
      { 
       z<<=1; 
       z^=1; 
      } 
    m=0x7FFFFFFF>>(31-a); 
    for(x=y;x<z;x==y?x<<=1:x++) 
      { 
       if(x<0)break; 
       n1=y,n2=m; 
       for(i=0;i<=b-a;i++) 
     { 
      if((x&n2)==n1){dat(x,b);break;} 
      n1<<=1; 
      n2<<=1; 
     } 
      } 
 
    return 0; 
} 


努力—前进—变老—退休—入土
2009-10-24 02:27
ccapp
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2009-10-23
收藏
得分:0 
哈哈   楼上的还没睡啊  很好的方法 可惜就是慢了点   好像正解只要用普通的loop加上运算公式就可以了  我还在用printf尝试中
2009-10-24 02:51
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
有精神的很,周未嘛!可以晚睡一点,刚在玩魔兽RPG……

努力—前进—变老—退休—入土
2009-10-24 03:02
快速回复:花了3天时间还是解不出来~求高手指教
数据加载中...
 
   



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

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