| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 990 人关注过本帖
标题:有关优化海明悬崖的探讨!
只看楼主 加入收藏
月破黄昏
Rank: 1
等 级:新手上路
帖 子:17
专家分:7
注 册:2011-5-11
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:5 
有关优化海明悬崖的探讨!
小弟又来请教了。最近写了个程序,觉得自己写的程序很笨,毫无新意,简练,高效,故又来请教大虾们了。希望多多指教了。
Problem Description
在信息编码中,两个二进制编码的对应位取值不同的数量称为这两个编码的海明距离。例如:10101和00110从第一位开始依次有第一位、第四、五位不同,则海明距离为3。

若两个二进制编码的每一位都不相同,则这两个编码产生了海明悬崖(Hamming Cliff)。例如,15的二进制编码为01111,16的二进制编码为10000,则产生“Hamming Cliff”。

任务:给你两个正整数,请你判断是否会产生“Hamming Cliff”。
Input
输入数据的第一行为一个正整数T, 表示测试数据的组数。然后是T组测试数据(1<=T<=30)。
每组测试数据输入两个正整数n,m(1<=n<=231-1)。
说明:若两个二进制编码长度不等,则在较短的编码前面添加前导0。
Output
对于每组测试数据,若产生“Hamming Cliff”输出Yes,否则输出No。
Sample Input
2
15 16
2 3
Sample Output
Yes
No
程序代码:
 #include<stdio.h>
int main()
{
  long a,b;
  int x[33],y[33];
  int i,j,m,n,s,t;
  scanf("%d\n",&t);
for(m=1;m<=t;m++)
{
      i=1;
      j=1;
      s=0;
     scanf("%d",&a);
     scanf("%d",&b);
    do
    {
    x[i]=a%2;
    i=i+1;
    a=a/2;
    }while(a!=0);
   
   do
   {
    y[j]=b%2;
    j=j+1;
    b=b/2;
   }while(b!=0);


 if(j==i)
  { 
     for(n=1;n<=i-1;n++)
    {if (x[n]==y[n])
       s=1;
    else
       s++;}
     if(s=1)
     { printf("No");
     printf("\n");}
     else
     {printf("Yes");
     printf("\n");}}


 if(j>i)
  { 
     for(n=i;n<=j-1;n++)
       x[n]=0;
     for(n=1;n<=j-1;n++)
     {  if (x[n]==y[n])
      s=1;
     else
      s++;}
      if(s==j-1)
      {printf("Yes");
      printf("\n");}
      else
      {printf("No");
      printf("\n");}
  }

 if(i>j)

 {  for(n=j;n<=i-1;n++)
     y[n]=0;
  for(n=1;n<=i-1;n++)
  {if (x[n]==y[n])
      s=1;
   else
      s++;}
      if(s==i-1)
      { printf("Yes");
      printf("\n");}
      else
      {printf("No");
      printf("\n");}
}

}
return 0;

}





搜索更多相关主题的帖子: 正整数 二进制 优化 
2011-07-03 22:08
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:7 
程序代码:
#include <stdio.h>
#include <string.h>

#define get(val, offset) ((((val) & (1 << (offset))) >> (offset)) & 1)

int get_left_offset(unsigned val) {
    int offset = sizeof(unsigned) * 8 - 1;
    while(!get(val, offset) && offset > 0)
        offset--;
    return offset;
}

unsigned is_hamming(unsigned m, unsigned n) {
    int m_left_offest = get_left_offset(m);
    int n_left_offset = get_left_offset(n);
    int offset = m_left_offest > n_left_offset ? m_left_offest : n_left_offset;
    m = ~m;
    while(offset) {
        if(get(m, offset) != get(n, offset))
            return 0;
        offset--;
    }
    return 1;
}

int main(void) {
    unsigned i = 0, t, m, n;
    char result[30][4];
    scanf("%u", &t);
    while(i < t) {
        scanf("%u%u", &m, &n);
        strcpy(result[i++], is_hamming(m, n) ? "Yes" : "No");
    }
    for(i = 0; i < t; i++)
        puts(result[i]);
    return 0;
} /*
2
15 16
2 3
Yes
No

Process returned 0 (0x0)   execution time : 4.266 s
Press any key to continue.
*/


[ 本帖最后由 lz1091914999 于 2011-7-4 14:43 编辑 ]

My life is brilliant
2011-07-04 13:54
lccwyj
Rank: 4
等 级:业余侠客
帖 子:71
专家分:203
注 册:2011-5-6
收藏
得分:3 
程序代码:
char m[1000],n[1000];
int a[100],t,b[100],c[100],i,j;
scanf("%d",&t);
for(i=0;i<t;i++)
scanf("%d%d",&a[i],&b[i]);
for(i=0;i<t;i++)
{itoa(a[i],m,2);
itoa(b[i],n,2);
itoa(atoi(m)+atoi(n),m,10);
for(j=0;j<strlen(m);j++)
if(m[j]!='1')
{c[i]=0;
break;}
if(j>=strlen(m))
c[i]=1;}
for(i=0;i<t;i++)
if(c[i]==1)
printf("yes\n");
else printf("no\n");
2011-07-04 14:26
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <string.h>

#define set(val, offset, bit) ((bit) ? ((val) |= 1 << (offset)) : ((val) &= ~(1 << (offset))))
#define get(val, offset) ((((val) & (1 << (offset))) >> (offset)) & 1)

int get_left_offset(unsigned val) {
    int offset = sizeof(unsigned) * 8 - 1;
    while(!get(val, offset) && offset > 0)
        offset--;
    return offset;
}

unsigned reverse(unsigned val, int offset) {
    while(offset > -1) {
        set(val, offset, !get(val, offset));
        offset--;
    }
    return val;
}

unsigned is_hamming(unsigned m, unsigned n) {
    int m_left_offest = get_left_offset(m);
    int n_left_offset = get_left_offset(n);
    int offset = m_left_offest > n_left_offset ? m_left_offest : n_left_offset;
    return reverse(m, offset) == n;     // or m == reverse(n, offset);
}

int main(void) {
    unsigned i = 0, t, m, n;
    char result[30][4];
    scanf("%u", &t);
    while(i < t) {
        scanf("%u%u", &m, &n);
        strcpy(result[i++], is_hamming(m, n) ? "Yes" : "No");
    }
    for(i = 0; i < t; i++)
        puts(result[i]);
    return 0;
}

My life is brilliant
2011-07-04 14:44
月破黄昏
Rank: 1
等 级:新手上路
帖 子:17
专家分:7
注 册:2011-5-11
收藏
得分:0 
回复 4楼 lz1091914999
要是大侠写的代码能照顾下菜鸟,通俗易懂点,就好了。
2011-07-05 12:11
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 5楼 月破黄昏
判断“海明悬崖”可以用这种算法;
如:x = 15(1111) 和 y = 16(10000),因为x比y的二进制少一位,所以往15前面补一个0,x = 15(01111) 和 y = 16(10000),这样两个的位数就相同了,只要x, y这两个数产生海明悬崖,~x 就等于 y 或 x 等于 ~y,因为~15 == 10000 而刚好与16(10000)相等,~16 = 01111刚好又和15(01111)相等,所以算法就出来了,但是不能直接用~x == y 或 x == ~y判断,因为unsigned int 在32位系统下为4字节,如果x = 15 那么~x = 0xFFFFFF10(11111111111111111111111100010000),y = 0x00000010(00000000000000000000000000010000),红色部分才是我们想要的,这时判断~x == y 就不行了,所以必需自己写一个取反函数,之后才能用reverse(x) == y 或 x == reverse(y)来判断。。。

My life is brilliant
2011-07-05 14:38
快速回复:有关优化海明悬崖的探讨!
数据加载中...
 
   



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

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