用lingo求解运输问题第4题,求快

算法 求解素数 和 快速求出一个数所有约数 - 木-天空 - 博客园
如何快速求出区间范围[0,x]内的素数?
Brute Force 总是那么的让人觉得亲近。
枚举每一个数,判断该数是否为素数?
bool isPrime( int x ) {
if(x & 2) return 0;
if(x == 2) return 1;
for ( int i=2; i*i&=x; ++i )
if(0 == x%i) return 0;
} // 用prime[0]存素数个数
for ( int i=0; i&=x; ++i )
if( isPrime(i) ) prime[++prime[0] ] =
暴力解决问题在很多时候都会存在效率低下这个问题。那么对于求素数这个问题如何提高效率呢?
其实很多数都是有公共因子的(公约数)。如果直接把这个公约数拿出来去踢出其倍数,被踢出的数都不会是素数的。例如:
2 可以踢出: 4 6 8 10 12 。。。2*x (x=2,3,4,5,6,7,8....)
3 可以踢出: 6 9 12 15 18。。。3*x(x=2,3,4,5,6,7,8....)
5 可以踢出: 10 15 20 25。。。5*x(x=2,3,4,5,6,7,8.....)
......... 依次做下去,剩余的数就是素数了。
int prime[3438];
bool isPrime[40007];
for ( int i=1; i&=x; ++i ) // 初始化所有的数都是素数
isPrime[i] = 1;
for ( int i=2; i&=x; ++i ) if(isPrime[i] ) { // 该数是素数
for ( int j=i+i; j&x; j+=i ) //踢出不是素数的数
isPrime[j] = 0;
for ( int i=2; i&=x; ++i ) // 存取素数
if(isPrime[i] ) prime[++prime[0] ] =
这样看貌似效率是提高了不少额。可是仔细分析上面的踢出非素数的过程会发现,有些数被踢出了好几次,为什么会出现这个问题呢?
x 可以踢出: x*2 x*3 x*4 &x*(x-1) x*x x*(x+1).....
不难发现其实x*2 x*3 x*4....x*(x-1)这些被更小的因子给踢出了。也就是说对于x应该踢出的数是从
x*x开始的。那么是不是这就已经优化到顶了呢? 没有哦。
开始考虑x*x是偶数,还是奇数。如果是偶数的话,x必然是偶数的。这中情况可以直接用素因子2直接把这些数踢出掉。
x*x是奇数,x必然是奇数了。 x*x+x是什么数呢? 是偶数。奇数+奇数=偶数。因为奇数%2=1,两个1相加就是偶数了。这样的话又会造成部分偶数被踢出多次。如何解决这个问题。呵呵,只需对x*x+x+x就好了,因为x*x+x是偶数 x*x+x+x,就是奇数了, 接下来的奇数就是x*x+2*(x+x)了。优化到此结束。
int prime[3438];
bool isPrime[40007];
void getPrime( int x ){
for ( int i=1; i&x; i+=2 )
isPrime[i] = 1, isPrime[i-1] = 0; // 首先踢出2的倍数
prime[prime[0]=1 ] = 2; // 存取第一个素数
for ( int i=3; ; i+=2 ) if(isPrime[i] ) { // 只考虑奇数了
int j = i*i, k = i+i;
if(j &= x) break;
while(j & x ) {
isPrime[j] = 0;
}// 存素数
for ( int i=3; i&x; i += 2 )
if(isPrime[i]) prime[++prime[0] ] =
对次求解素数已经完毕了。
&接下来是将x分解成素因子的乘积
求x = p[1]^cnt[1]*p[2]^cnt[2]*p[3]^cnt[3]。。。。p[...]^cnt[...] &p[]是素因子
int p[3438], cnt[3438];
void getPrimeDivisor( int x ) {
p[0] = cnt[0] = 0; int
for ( int i=1; prime[i]*prime[i]&=x
&& i&=prime[0]; ++i ) {
while( x%prime[i] == 0 ) {
++t; x /= prime[i];
if( t ) p[++p[0] ] = prime[i], cnt[++cnt[0] ] =
if(x & 1) p[++p[0] ] = x, cnt[++cnt[0] ] = 1;
// 此时x必定是个素数。 因为在sqrt(x)内都没有找到其因子
此时x的因子个数=(cnt[1]+1)*(cnt[2]+1)*(cnt[3]+1)*(cnt[4]+1)....
额,只知道因子个数而已。不是很好玩ing。能不能求出x的所有约数呢? 恭喜你,这是可以滴。
利用乘法原理对约数集合乘以一个约数得到新的集合,
int divisor[1500];
void getDivisor( int x ) { // 或得x的所有因子
getPrimeDivisor(x); // 对x进行素因子分解
divisor[0] = 1; // 存取因子个数
divisor[1] = 1;
for ( int i=1; i&=p[0]; ++i ) {
int nowNum = divisor[0];
int base = 1;
for ( int j=1; j&=cnt[i]; ++j )
base *= p[i];
for ( int k=1; k&=divisor[0]; ++k )
divisor[++nowNum ] = divisor[k]*base;
divisor[0] = nowN
下面通过一道题来测试代码的正确性:
hdoj 4432&
题意是求n的所有约数,并把每个约数转化为m进制,把每个进制为的平方加起来。再把最后的结果转化为m进制。简单吧。
#include &iostream&
#include &cstdio&
#include &cstring&
#include &algorithm&
using namespace
int prime[3438];
bool isPrime[40007];
void getPrime( int x ){
for ( int i=1; i&x; i+=2 )
isPrime[i] = 1, isPrime[i-1] = 0;
prime[prime[0]=1 ] = 2;
for ( int i=3; ; i+=2 ) if(isPrime[i] ) {
int j = i*i, k = i+i;
if(j &= x) break;
while(j & x ) {
isPrime[j] = 0;
for ( int i=3; i&x; i+=2 )
if(isPrime[i]) prime[++prime[0] ] =
int p[3438], cnt[3438];
void getPrimeDivisor( int x ) {
p[0] = cnt[0] = 0; int
for ( int i=1; prime[i]*prime[i]&=x
&& i&=prime[0]; ++i ) {
while( x%prime[i] == 0 ) {
++t; x /= prime[i];
if(t ) p[++p[0] ] = prime[i], cnt[++cnt[0] ] =
if(x & 1) p[++p[0] ] = x, cnt[++cnt[0] ] = 1;
int divisor[1500];
void getDivisor( int x ) {
getPrimeDivisor(x);
divisor[0] = 1;
divisor[1] = 1;
for ( int i=1; i&=p[0]; ++i ) {
int nowNum = divisor[0];
int base = 1;
for ( int j=1; j&=cnt[i]; ++j )
base *= p[i];
for ( int k=1; k&=divisor[0]; ++k )
divisor[++nowNum ] = divisor[k]*base;
divisor[0] = nowN
int get( int x, int bit ){
int ret = 0;
while(x ) {
ret += (x%bit)*(x%bit);
void print( int x, int bit ) {
int a[100]={0};
while( x ) {
a[++a[0] ] = x%
for ( int i=a[0]; i&0; --i)
if(a[i] & 9) printf("%c", a[i]-10+'A');
else printf("%d", a[i]); puts("");
int main(){
getPrime(32000);
while( ~scanf("%d%d", &n, &m) ) {
getDivisor(n);
int ans = 0;
for ( int i=1; i&=divisor[0]; ++i ) {
ans += get(divisor[i], m);
print(ans, m);
关于素数的运用还有很多的,比如求数x的所有约数的和。初等数论还是挺有意思的,可惜没时间整了,悲剧啊。用遗传算法求解函数 f(x)=x*sin(10*pi*x)+1.0 的最大值,其中x在[-1,2]范围.将求解的程序上传.属于《人工智能》范畴,快速求答案.
C语言代码可以的吧?还是matlab代码?两个我都有,不过前者求解的函数是y = -x的平方+ 5,后者的函数是f=x+10*sin(5*x)+7*cos(4*x),建议你修改下代码
设函数f(x)=x(e^x+ae^-x)(x属于R)是偶函数,则实数a的值为_____e^x为e的x次方ae^-x为a乘上e的-x次方
f(-x)=f(x)-x[(e^-x)+(ae^x)]=x(e^x+ae^-x)多项式相等,对应项的系数相等,所以a=-1
m^2-m-1=0,n^2-n-1=0由题意知m,n为方程x^2-x-1=0的两个不同的实根.由韦达定理知m+n=1,mn=-1m^2+n^2+2mn=(m+n)^2m^2+n^2=1+2=3(m^2+n^2)^2=m^4+2(mn)^2+n^49=m^4+n^4+2m^4+n^4=7(m^2+n^2)(m+n)=m^3+mn^2+m^2n+n^33=m^3+n^3+mn(m+n)m^3+n^3=3-(-1)*1=4(m^3+n^3)(m^4+n^4)=m^7+n^7+m^3n^4+m^4n^3=m^7+n^7+m^3n^3(m+n)4*7=m^7+n^7+(-1)^3*1m^7+n^7=28-(-1)^3*1=28+1=29
2x-2分之3-x-1分之x平方=1/2-3/2x3/(2x-2)-x?/(x-1)=1/2-3/2x两边同时乘以2x(x-1),得3x-2x?=x(x-1)-3(x-1)3x-2x?=x?-x-3x+32x?+x?-7x+3=0解x=1/2,或x=-1/2±√13/2
共点力作用下物体的平衡如图所示,均匀直棒AB的A端在水平力F作用下,处于静止状态,则地面对直棒的作用力方向是( )(A)F1方向,(B)F2方向,(C)F3方向,(D)F4方向.我知道F4肯定不对,但我觉得F1 F2 F3都行啊,为什么答案只有C?
C你以F的受力点为转轴,要力矩平衡,只能是C
其他相关问题帖子很冷清,卤煮很失落!求安慰
手机签到经验翻倍!快来扫一扫!
10浏览 / 8回复
华为拍视频的时候感觉总在对焦,肿么解决?感觉不清晰啊
我也喜欢拍摄视频呢,一般拍摄过程中移动幅度过大也会影响拍摄质量的。楼主拍摄视频时,试试选择在光线较好的环境,然后等待视频对焦完成,画面清晰后再开始拍摄的。拍摄过程中保持手机平稳,移动幅度也不能过大过快的哦。
棉花糖少糖 发表于
17:09我也喜欢拍摄视频呢,一般拍摄过程中移动幅度过大也会影响拍摄质量的。楼主拍摄视频时,试试选择在光线较好 ...
主要是拍弹琴的视频,手动的幅度有点大,老在对焦,视频就会有点模糊。
你好,被拍摄物移动太快或者动作幅度大,会造成超出焦距范围,需要重新对焦,
调皮会死人的
强力支持!!!!!!!!!!!
我只是来水经验的
连这些都不懂,赶紧洗洗睡吧。
不是为楼主这样的标题所吸引,也不是被帖子的内容所迷惑。我不是来抢沙发的,也不是来打酱油的。我不是为楼主呐喊加油的,也不是对楼主进行围堵攻击的。
可能感兴趣的板块:
用户名/注册邮箱/注册手机号
其他第三方号登录}

我要回帖

更多关于 matlab求解最优化问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信