C. 下一个K-number 不知道哪里错了~

C. 下一个K-number 不知道错哪了~~
本帖最后由 aiyinsimei 于 2013-03-24 20:16:12 编辑

C. 下一个K-number
Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB
Total Submission: 222   Submission Accepted: 34 
Description
我们首先定义一种k-number。
对于某一个数,在二进制表示中,如果有k位为1,则这个数称为k-number。
如:14=(1110)2 ,则14被称为3-number。
现如今给一个正整数n,如果n是k-number,则求出下一个k-number m。
即不存在num是k-number,且n < num < m 。



Input
一个整数T,表示T组数据。 (1<=T<=1000)
对于每组数据:
一个整数n。 (1<=n<=1000000000)



Output
对于每组数据,输出下一个k-number。


Sample Input
Original  Transformed  

4
1
5
16
11
4[EOL] 1[EOL] 5[EOL] 16[EOL] 11[EOL] [EOF] 

Sample Output
Original  Transformed  

2
6
32
13
2[EOL] 6[EOL] 32[EOL] 13[EOL] [EOF] 

Hint
Sample 3:16=(10000)2,下一个1-number是 32=(100000)2
Sample 4:11=(1011)2,下一个3-number 是 13=(1101)2



题目思想我是知道的,嗯,目测这题是比较简单的,因为我边上两娃不到十分钟就写出来了。。我的代码样例过了,也测试了好几组。。提交总是wa。。不知原因。。望广大好友们帮帮我看看哦。。谢谢啦。


#include<stdio.h>
#include<stdlib.h>
int cmp(const void *p,const void *q)
{
return *(int *)p<*(int *)q;
}

int main()
{int t;
scanf("%d",&t);
int i;
long int uu[100000];
for(i=0;i<t;i++)
{
long int n,m,ww,kk;
int r=0,p=0;
scanf("%ld",&n);
ww=n;

while(n)
{if(n&1)
r++;
p++;
n>>=1;
}

int j,k;
long int t;
kk=ww;
for(j=0;j<p;j++)
{uu[j]=ww&1;
ww>>=1;
}
for(j=1;j<p;j++)
{
if(uu[j-1]==1&&uu[j]==0){t=uu[j];uu[j]=uu[j-1];uu[j-1]=t;break;}
}


m=0;
long int ll=1;
if(j==p){
uu[p]=0;
t=uu[j];uu[j]=uu[j-1];uu[j-1]=t;
qsort(uu,j-1,sizeof(uu[0]),cmp);
}
else {qsort(uu,j,sizeof(uu[0]),cmp);uu[p]=0;}

for(k=0;k<=p;k++)
{
m+=uu[k]*ll;
ll*=2;
}
printf("%ld\n",m);

}

return 0;
}

c

------解决方案--------------------
看上去写的好复杂的样子。
个人思路供参考:
数据数据分析:
输入有2种形式:
1.最高的0所处的位置右边没有1: 1 1 1 1 0 0 0 0  在最低位追加 一位0
2.最高的0所处的位置右边有1  : 1 0 1 0 1 0 0 0 最高的0和其右边的最近的一个1交换

最后可以设计算法 最多只要 右移 32 次可以完成查找工作,加上1次与,1次或 得到下个k数的操作。
------解决方案--------------------
#include<cstdio>
using namespace std;
int main()
{
    int T,i,countx;
    __int64 n;
    scanf("%d",&T);
    for(; T--;)
    {
        scanf("%I64d",&n);
        countx=0;
        for(i=0; i<32; ++i)
        {
            if((n&(1<<i))&&((~n)&(1<<(i+1))))