有2个问题,关系重大,需要各位高手帮助,不够另开帖子给分

bing_huo 2003-11-18 08:41:30
1。反转一个无符号字符变量 c=10101111(二进制)反转结果 a=11110101
需要c的实现,非常感谢。
2。求一个很大数比如 1000000以内的素数,要求时间优化的算法,我除了想到去掉数,
然后用数本身和它的平方根以下的数比较之外 没有想到其他的优化,请各位大虾帮助。。再次表示感谢 ,可用分我有 我也知道这对高手并不很重要,但是这2个问题对我真的很重要,希望大家帮助。。。。。奶油斑竹 快出来帮忙啦。。。
...全文
67 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
well100 2003-12-08
  • 打赏
  • 举报
回复
偶偶然看到bing_huo的帖子
你说用你的方法算1000000(或更大的数)的时间回很长,我试着怀疑的态度,下了程序如下:
/ prime.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
#include<windows.h>
#include<cmath>
//#include<stack>
using namespace std;
long isPrime(long n)
{
if(n==1)
return 0;
for(int i=3;i<=sqrt(n);i+=2)
{
if(n%i==0)
return 0;
}
return 1;
}
void main()
{
cout<<"input a number!"<<endl;
long n;
cin>>n;
DWORD start=GetTickCount();
//stack<int> STACK;
if(n>=2)
cout<<2<<endl;
for(int i=3;i<=n;i+=2)
{

if(isPrime(i))
cout<<i<<endl;
//STACK.push(i);
//STACK.pop();
}
DWORD finish=GetTickCount();
cout<<"the cost of time is"<<(finish-start)/1000.0<<endl;
cin>>n;
cin.get();
}
最后运行结果如下:
10000 the cost of time 0.68
1000000 the cost of time 56.551
如果去掉输出语句,1000000的所用时间只有5秒多呀,
我怎么感觉速度还可以把!

注:
上面程序用vc运行
机子cpu为赛杨733

不懂,请高手指教!
xdspower 2003-11-21
  • 打赏
  • 举报
回复
我还是觉得 lieyanfriend(黄奇) 的效率最高,而且合理应用了公用体的特效!!!!!
xdhust 2003-11-20
  • 打赏
  • 举报
回复
第一道题:
char reverse(char c)
{
int i;
char s,x=0;
for(i=0; i<8; i++)
{
s= c&1;//每次取最后一位
x= ((s<<(7-i)) | x);//将取到的添加到反转数上
c= c>>1;
}
return x;
}
bing_huo 2003-11-20
  • 打赏
  • 举报
回复
其实题目的要求是10^10以内的素数
hjf1010 2003-11-20
  • 打赏
  • 举报
回复
上面的程序有问题更正一下
char reversebit(char c)
{
char a;
char b;
int i;
a=1;
b=0;
for(i=0;i<8;i++)
{
b=b<<1;
if ((c&(a<<i)!=0)
{
b=b|1;
}
}
return b;
}
调试通过,敬请指教
wangprince 2003-11-20
  • 打赏
  • 举报
回复
我觉得,从2开始,每判断出一个素数,就先从数列中去除掉该素数的整数倍,再循环下一条判断。我没有编,你先试试,再想其他办法。
hjf1010 2003-11-20
  • 打赏
  • 举报
回复
char reversebit(char c)
{
char a;
char b;
int i;
a=1;
b=0;
for(i=0;i<8;i++)
{
b=b<<1;
b=b|(c&(a<<i));
}
return b;
}
303afei 2003-11-20
  • 打赏
  • 举报
回复
int i,sum=0;
for(i = 0; i < 8; i ++ )
{
s << i;
if(s & 0x80)
{
sum + = (1<<i);
}
}
bing_huo 2003-11-19
  • 打赏
  • 举报
回复
to: ALNG(?)
先说声 谢谢!

求素数那个问题,只要求判断 不需要存储或者显示,用注释标出判断就可以,我用最笨的算法,计算10^10 算了12个小时没有结束,证明算法失败,我的实现方式就是去掉偶数,用2-数本身开方来做除法比较,不知道还可以怎么优化
孩皮妞野 2003-11-19
  • 打赏
  • 举报
回复
第一题效率比较高一点的办法[查表法]

char bit_reverse(char c)
{
static char table[8][2]={ {'\x1','\x80'},
{'\x2','\x40'},
{'\x4','\x20'},
{'\x8','\x10'},
{'\x10','\x8'},
{'\x20','\x4'},
{'\x40','\x2'},
{'\x80','\x1'}
};
char tmp = 0;
for(unsigned i=0; i<8; ++i)
if(c & table[i][0])
tmp |= table[i][1];
return tmp;
}

或者

char bit_reverse(char c)
{
static char table[8]={'\x1','\x2','\x4','\x8''\x10','\x20','\x40','\x80'};
char tmp = 0;
for(unsigned i=0, j=7; i<8; ++i,--j)
if(c & table[i])
tmp |= table[j];
return tmp;
}
孩皮妞野 2003-11-19
  • 打赏
  • 举报
回复
这是输入1,000,000,000时的结果,耗时不到1秒

The max prime not greater than 1000000000 is 999999937
孩皮妞野 2003-11-19
  • 打赏
  • 举报
回复
质数问题,一次编译通过,不知道有没有逻辑错误。没有注释。

#include <vector>
#include <iostream>
#include <math.h>

void all_prime(unsigned upper_bound, std::vector<unsigned>& output)
{
output.clear();
if(upper_bound<2)
return;
for(unsigned i=2; i<=upper_bound; ++i){
for(unsigned j=0; j<output.size(); ++j){
if( i % output[j]==0) // is not a prime
goto not_a_prime;
}
output.push_back(i);
not_a_prime:
}
}

bool is_prime(unsigned u, const std::vector<unsigned>& primes)
{
for(unsigned i=0; i<primes.size();++i)
if(u%primes[i]==0)
return false;
return true;
}


unsigned get_max_prime(unsigned upper_bound)
{
unsigned u = sqrt(upper_bound);
std::vector<unsigned> primes;
all_prime(u, primes);

for(u=upper_bound; ! is_prime(u,primes); --u)
;
return u;
}




int main(int argc, char* argv[])
{
using namespace std;

unsigned u;
cout<<"Enter a upper bound:";
cin>>u;
cout<<"The max prime not greater than "<<u<<" is "
<<get_max_prime(u)<<endl;
return 0;
}
逍遥的心 2003-11-19
  • 打赏
  • 举报
回复
以上我关于第一个问题的解答,intTemp =0;可以不要
同时,可以通过简单的宏修改,实现位变化,通过函数中
参数intBitNum的指定,实现指定位数的逆反
逍遥的心 2003-11-19
  • 打赏
  • 举报
回复
帖子不能编辑:
UBYTE GetDefNum(UBYTE intSouNum,intBitNum)
改成
UBYTE GetDefNum(UBYTE intSouNum,UBYTE intBitNum)
逍遥的心 2003-11-19
  • 打赏
  • 举报
回复
关于第一个问题,我的解答如下:
// *******************************
// * Writen by Freeheart 2003.11 *
// * program by C/C++ *
// * 函数说明: *
// * intSouNum为源数 *
// * intBitNum为数位数 *
// * GetDefNum函数返回逆反数 *
// *******************************
// *Program Begin.
#define UBYTE unsigned int ;
UBYTE GetDefNum(UBYTE intSouNum,intBitNum)
{
UBYTE intTemp = 0,intAddNum = 1,intTempDest = 0 ;
for(int i=0;i<intBitNum;i++)
{
intTemp = intSouNum & intAddNum;
intAddNum<< 1 ;
intTemp <<(intBitNum - i - 1 );
intTempDest |= intTemp;
intTemp =0;
}
return intTempDest;
}
// *Program End.
xdspower 2003-11-19
  • 打赏
  • 举报
回复
最简单的取位是
构造该位标志数如 bitflg=0x01就是取最低位的c&bitflg的结果就是c在最低位的值,你变化bitflg值就可以取到各个位了,不过一般bitflg值的变化是用的移位操作,bitflg=bitflg<<1


lieyanfriend(黄奇)的方法十分精巧,合理应用的公用体特性,从而基本上就没有使用位运算了。
bing_huo 2003-11-19
  • 打赏
  • 举报
回复
up....素数的问题还是不行,,,用最普通的方法 算了12个小时还没有结束。。。。。。。。
筛法能实现这么大的数吗?
byzxy 2003-11-19
  • 打赏
  • 举报
回复
“求一个很大数比如 1000000以内的素数,要求时间优化的算法,”
可以理解为 1000000 以内的所有素数吗?
byzxy 2003-11-19
  • 打赏
  • 举报
回复
第一题
char bit_reverse(char c)
{
char x=0,s;
for(int i=0;i<8;i++)
{
x = x <<1;
s = c & 1;
x = x | s;
c = c >>1;
}
return x;
}
zhouqingyuan 2003-11-18
  • 打赏
  • 举报
回复
怎么都这样呢,不是有bitset类吗,用它封装的操作,很简单的啊。
加载更多回复(17)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧