| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4854 人关注过本帖
标题:[讨论]第七次编程题目,大家支持一下
只看楼主 加入收藏
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

#include "stdafx.h"
#include "iostream"
typedef __int64 INT64;
void HeroNeedThree(INT64* subset, unsigned int n)
{
// base3[k]=3^k
static INT64 base3[32]=
{
0x1,0x3,0x9,0x1b,0x51,0xf3,0x2d9,0x88b,
0x19a1,0x4ce3,0xe6a9,0x2b3fb,0x81bf1,0x1853d3,0x48fb79,0xdaf26b,
0x290d741,0x7b285c3,0x17179149,0x4546b3db,0xcfd41b91,0x26f7c52b3,0x74e74f819,0x15eb5ee84b,
0x41c21cb8e1,0xc546562aa3,0x24fd3027fe9,0x6ef79077fbb,0x14ce6b167f31,0x3e6b41437d93,0xbb41c3ca78b9,0x231c54b5f6a2b
};
// base2[k]=2^k
static unsigned int base2[32]=
{
0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80,
0x100,0x200,0x400,0x800,0x1000,0x2000,0x4000,0x8000,
0x10000,0x20000,0x40000,0x80000,0x100000,0x200000,0x400000,0x800000,
0x1000000,0x2000000,0x4000000,0x8000000,0x10000000,0x20000000,0x40000000,0x80000000
};
INT64 num=0;
n--;
for(int i=31;i>=0;--i)
{
if(n & base2[i]) // 计算n的第i位上是否是1
{
subset[++num]=base3[i];
}
}
subset[0]=num;
}

int main(int argc, char* argv[])
{

unsigned int n;
INT64 subset[40];
std::cin>>n;
HeroNeedThree(subset,n);
printf("%I64d\n",subset[0]);
for(INT64 i=0;i<subset[0];++i)
printf("%I64d,",subset[i+1]);
return 0;
}


倚天照海花无数,流水高山心自知。
2007-03-13 21:04
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

void HeroNeedThree(INT64* subset, unsigned int n)
{
static INT64 s_HelperCount[] =
{
1, 3, 9, 27,
81, 243, 729, 2187,
6561, 19683, 59049, 177147,
531441, 1594323, 4782969, 14348907,
43046721, 129140163, 387420489, 1162261467,
3486784401, 10460353203, 31381059609, 94143178827,
282429536481, 847288609443, 2541865828329, 7625597484987,
22876792454961, 68630377364883, 205891132094649,617673396283947,
};


int idx = 32;
int cnt = 0;

n--;
while(idx>0)
{
idx--;
if(((n)&(1<<(idx))))
{
cnt++;
subset[cnt] = s_HelperCount[idx];
}


}
subset[0] = cnt;
}


倚天照海花无数,流水高山心自知。
2007-03-13 21:05
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

void HeroNeedThree(INT64* subset, unsigned int n)
{
static INT64 powof3[32];
static int initialized=0;
int i;
if(!initialized)
{
//你也可以在定义时直接初始化这个数组,如果你有耐心写一堆数字的话^_^
for(i=1,powof3[0]=1;i<32;i++)
{
powof3[i]=powof3[i-1]*3;
}
initialized=1;
}

for(i=31,subset[0]=0,n--;i>=0;i--)
{
if(n&(1<<i)) //检查对应2进制位是否为1
{
subset[++subset[0]]=powof3[i];
}
}
}


倚天照海花无数,流水高山心自知。
2007-03-13 21:06
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
以下是引用iwfy在2007-3-13 21:01:27的发言:
当输入32769-65536的时候是{}
在这个范围内,我的程序还是可以算出来的,不知道你用什么编译器了.但数据很大时就得不到正确的结果.
32767
{ 4782969, 1594323, 531441, 177147, 59049, 19683, 6561, 2187, 729, 243, 81, 27,
9, 3 }
65535
{ 14348907, 4782969, 1594323, 531441, 177147, 59049, 19683, 6561, 2187, 729, 243
, 81, 27, 9, 3 }
100000
{ 43046721, 14348907, 59049, 19683, 2187, 81, 27, 9, 3, 1 }

倚天照海花无数,流水高山心自知。
2007-03-13 21:11
iwfy
Rank: 1
等 级:新手上路
威 望:2
帖 子:888
专家分:0
注 册:2007-2-23
收藏
得分:0 
我用的是win-tc,就咱这里下载的

英语不好还想学编程??逆天之路,不由分说!! 数学太差还想学编程??离经叛道,义无返顾!!
2007-03-13 21:15
zcs302
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2007-3-6
收藏
得分:0 
回复:(无玩过界)to:zcs302,也有BUG12345##########...
嗯.....永不放弃!!!!已经改好了
else if(*(p+i)=='#') //处理退格符
{
if((outlen-1==enter && enter!=0) || outlen==0) //行首出现#的情况
continue;
else
outlen--; //一般情况
}
红色部分由(outlen-1==enter || outlen==0)改为((outlen-1==enter && enter!=0) || outlen==0)
2007-03-13 21:53
无玩过界
Rank: 1
等 级:新手上路
威 望:2
帖 子:246
专家分:0
注 册:2007-2-20
收藏
得分:0 
to:zcs302精神可亲敬,我会帮你继续检查

2007-03-13 22:02
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
回复:(nuciewth)以下皆转载,看看别人是怎么写的.[e...
楼主,我觉得已经写的够好了,你装载的那几个更有新意,以前我都觉得位运算没有什么作用,今天是见识了

2007-03-14 10:47
zcs302
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2007-3-6
收藏
得分:0 
回复:(无玩过界)to:zcs302精神可亲敬,我会帮你继续...

谢谢你

2007-03-14 11:15
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
以下是引用nuciewth在2007-3-13 21:00:32的发言:

以下皆转载,看看别人是怎么写的.

#include <stdio.h>
//Viusal C++ 6.0
#define BIGINT __int64
#define FORMAT "%I64d"
/*
mingw use this macro
#define BIGINT long long
#define FORMAT "%I64d"

linux use this macro
#define BIGINT long long
#define FORMAT "%lld"
*/

BIGINT ThreePower[32];

void HeroNeedThree(BIGINT* subset, BIGINT n)
{
int t, p;
BIGINT m;
m = n-1;
for (t = 0; m; m&=m-1) t++;//这个好象是用来计算集合元素的个数,楼主能不能从
//数学上解释一下
p = 0; m = n-1; subset[0] = t;
while (t)
{
if (m & 1) subset[t--] = ThreePower[p];
p++;
m >>= 1;
}
}

int main()
{
int i;
BIGINT n, subset[33];
ThreePower[0] = 1;
for (i = 1; i < 32; i++) ThreePower[i] = ThreePower[i-1]*3;
while (EOF != scanf(FORMAT, &n))
{
HeroNeedThree(subset, n);

printf("{ ");
for (i = 1; i < subset[0]; i++) printf(FORMAT", ", subset[i]);
if (subset[0]) printf(FORMAT" ", subset[subset[0]]);
puts("}");
}
return 0;
}


2007-03-14 11:45
快速回复:[讨论]第七次编程题目,大家支持一下
数据加载中...
 
   



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

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