发布网友 发布时间:2022-04-24 02:54
共4个回答
热心网友 时间:2023-10-23 04:13
其他的几个就然别人起坐吧,我就跟你讲一讲求素数的方法,
PS:素数应该来讲学过编程的人都会做,但是关键我在这里要说的就是效率问题,
不知道有没有国际最优,但我这个算法很顶尖了:计算1亿以内的素数个数不到2秒钟,记住是不到2秒钟。。。
#include<iostream>
using namespace std;
int main()
{int CompositeNumFilterV3(int);
int m,c;
cin>>m;
c=CompositeNumFilterV3(m);
cout<<c<<endl;
return 0;
}
//求素数的程序
int CompositeNumFilterV3(int n)
{
int i, j;
//素数数量统计
int count = 0;
// 分配素数标记空间,明白+1原因了吧,因为浪费了一个flag[0]
char* flag = (char*)malloc( n+1 );
// 干嘛用的,请仔细研究下文
int mpLen = 2*3*5*7*11*13;
char magicPattern[2*3*5*7*11*13]; // 奇怪的代码,why,思考无法代劳,想!
for (i=0; i<mpLen; i++)
{
magicPattern[i++] = 1;
magicPattern[i++] = 0;
magicPattern[i++] = 0;
magicPattern[i++] = 0;
magicPattern[i++] = 1;
magicPattern[i] = 0;
}
for (i=4; i<=mpLen; i+=5)
magicPattern[i] = 0;
for (i=6; i<=mpLen; i+=7)
magicPattern[i] = 0;
for (i=10; i<=mpLen; i+=11)
magicPattern[i] = 0;
for (i=12; i<=mpLen; i+=13)
magicPattern[i] = 0;
// 新的初始化方法,将2,3,5,7,11,13的倍数全干掉
// 而且采用memcpy以mpLen长的magicPattern来批量处理
int remainder = n%mpLen;
char* p = flag+1;
char* pstop = p+n-remainder;
while (p < pstop)
{
memcpy(p, magicPattern, mpLen);
p += mpLen;
}
if (remainder > 0)
{
memcpy(p, magicPattern, remainder);
}
flag[2] = 1;
flag[3] = 1;
flag[5] = 1;
flag[7] = 1;
flag[11] = 1;
flag[13] = 1;
// 从17开始filter,因为2,3,5,7,11,13的倍数早被kill了
// 到n/13止的,哈哈,少了好多吧
int stop = n/13;
for (i=17; i <= stop; i++)
{
// i是合数,请歇着吧,因为您的工作早有您的质因子代劳了
if (0 == flag[i]) continue;
// 从i的17倍开始过滤
int step = i*2;
for (j=i*17; j <= n; j+=step)
{
flag[j] = 0;
}
}
// 统计素数个数
for (i=2; i<=n; i++)
{
if (flag[i]) count++;
}
// 因输出费时,且和算法核心相关不大,故略
// 释放内存,别忘了传说中的内存泄漏
free(flag);
return count;
}
==============================
这个算法你拿给老师看,会把所有的算法题目全比下去,其他的题目也会黯然失色。有一个汇编语言版的,我在这里就不拿出来了, 因为看样子你也没学过汇编。那效率。。像飞机一样的快。追问拿这个给老师我就死定了
热心网友 时间:2023-10-23 04:13
其他的几个就然别人起坐吧,我就跟你讲一讲求素数的方法,
PS:素数应该来讲学过编程的人都会做,但是关键我在这里要说的就是效率问题,
不知道有没有国际最优,但我这个算法很顶尖了:计算1亿以内的素数个数不到2秒钟,记住是不到2秒钟。。。
#include<iostream>
using namespace std;
int main()
{int CompositeNumFilterV3(int);
int m,c;
cin>>m;
c=CompositeNumFilterV3(m);
cout<<c<<endl;
return 0;
}
//求素数的程序
int CompositeNumFilterV3(int n)
{
int i, j;
//素数数量统计
int count = 0;
// 分配素数标记空间,明白+1原因了吧,因为浪费了一个flag[0]
char* flag = (char*)malloc( n+1 );
// 干嘛用的,请仔细研究下文
int mpLen = 2*3*5*7*11*13;
char magicPattern[2*3*5*7*11*13]; // 奇怪的代码,why,思考无法代劳,想!
for (i=0; i<mpLen; i++)
{
magicPattern[i++] = 1;
magicPattern[i++] = 0;
magicPattern[i++] = 0;
magicPattern[i++] = 0;
magicPattern[i++] = 1;
magicPattern[i] = 0;
}
for (i=4; i<=mpLen; i+=5)
magicPattern[i] = 0;
for (i=6; i<=mpLen; i+=7)
magicPattern[i] = 0;
for (i=10; i<=mpLen; i+=11)
magicPattern[i] = 0;
for (i=12; i<=mpLen; i+=13)
magicPattern[i] = 0;
// 新的初始化方法,将2,3,5,7,11,13的倍数全干掉
// 而且采用memcpy以mpLen长的magicPattern来批量处理
int remainder = n%mpLen;
char* p = flag+1;
char* pstop = p+n-remainder;
while (p < pstop)
{
memcpy(p, magicPattern, mpLen);
p += mpLen;
}
if (remainder > 0)
{
memcpy(p, magicPattern, remainder);
}
flag[2] = 1;
flag[3] = 1;
flag[5] = 1;
flag[7] = 1;
flag[11] = 1;
flag[13] = 1;
// 从17开始filter,因为2,3,5,7,11,13的倍数早被kill了
// 到n/13止的,哈哈,少了好多吧
int stop = n/13;
for (i=17; i <= stop; i++)
{
// i是合数,请歇着吧,因为您的工作早有您的质因子代劳了
if (0 == flag[i]) continue;
// 从i的17倍开始过滤
int step = i*2;
for (j=i*17; j <= n; j+=step)
{
flag[j] = 0;
}
}
// 统计素数个数
for (i=2; i<=n; i++)
{
if (flag[i]) count++;
}
// 因输出费时,且和算法核心相关不大,故略
// 释放内存,别忘了传说中的内存泄漏
free(flag);
return count;
}
==============================
这个算法你拿给老师看,会把所有的算法题目全比下去,其他的题目也会黯然失色。有一个汇编语言版的,我在这里就不拿出来了, 因为看样子你也没学过汇编。那效率。。像飞机一样的快。追问拿这个给老师我就死定了
热心网友 时间:2023-10-23 04:13
其他的几个就然别人起坐吧,我就跟你讲一讲求素数的方法,
PS:素数应该来讲学过编程的人都会做,但是关键我在这里要说的就是效率问题,
不知道有没有国际最优,但我这个算法很顶尖了:计算1亿以内的素数个数不到2秒钟,记住是不到2秒钟。。。
#include<iostream>
using namespace std;
int main()
{int CompositeNumFilterV3(int);
int m,c;
cin>>m;
c=CompositeNumFilterV3(m);
cout<<c<<endl;
return 0;
}
//求素数的程序
int CompositeNumFilterV3(int n)
{
int i, j;
//素数数量统计
int count = 0;
// 分配素数标记空间,明白+1原因了吧,因为浪费了一个flag[0]
char* flag = (char*)malloc( n+1 );
// 干嘛用的,请仔细研究下文
int mpLen = 2*3*5*7*11*13;
char magicPattern[2*3*5*7*11*13]; // 奇怪的代码,why,思考无法代劳,想!
for (i=0; i<mpLen; i++)
{
magicPattern[i++] = 1;
magicPattern[i++] = 0;
magicPattern[i++] = 0;
magicPattern[i++] = 0;
magicPattern[i++] = 1;
magicPattern[i] = 0;
}
for (i=4; i<=mpLen; i+=5)
magicPattern[i] = 0;
for (i=6; i<=mpLen; i+=7)
magicPattern[i] = 0;
for (i=10; i<=mpLen; i+=11)
magicPattern[i] = 0;
for (i=12; i<=mpLen; i+=13)
magicPattern[i] = 0;
// 新的初始化方法,将2,3,5,7,11,13的倍数全干掉
// 而且采用memcpy以mpLen长的magicPattern来批量处理
int remainder = n%mpLen;
char* p = flag+1;
char* pstop = p+n-remainder;
while (p < pstop)
{
memcpy(p, magicPattern, mpLen);
p += mpLen;
}
if (remainder > 0)
{
memcpy(p, magicPattern, remainder);
}
flag[2] = 1;
flag[3] = 1;
flag[5] = 1;
flag[7] = 1;
flag[11] = 1;
flag[13] = 1;
// 从17开始filter,因为2,3,5,7,11,13的倍数早被kill了
// 到n/13止的,哈哈,少了好多吧
int stop = n/13;
for (i=17; i <= stop; i++)
{
// i是合数,请歇着吧,因为您的工作早有您的质因子代劳了
if (0 == flag[i]) continue;
// 从i的17倍开始过滤
int step = i*2;
for (j=i*17; j <= n; j+=step)
{
flag[j] = 0;
}
}
// 统计素数个数
for (i=2; i<=n; i++)
{
if (flag[i]) count++;
}
// 因输出费时,且和算法核心相关不大,故略
// 释放内存,别忘了传说中的内存泄漏
free(flag);
return count;
}
==============================
这个算法你拿给老师看,会把所有的算法题目全比下去,其他的题目也会黯然失色。有一个汇编语言版的,我在这里就不拿出来了, 因为看样子你也没学过汇编。那效率。。像飞机一样的快。追问拿这个给老师我就死定了
热心网友 时间:2023-10-23 04:14
1.
for(int i=0; i<20; i++)
{
for (int j= 0; j<34; j++)
{
for( int k = 0; k < 100; k+=3)
{
if(i+j+k == 100 && 5*i + 3*j + k/3 == 100)
{
printf("公鸡 = %d, 母鸡 = %d , 小鸡 = %d",i,j,k);
return ;
}
}
}
}
2.
int maxdivisor = 1, x, y,x1,y1,k;
int minmultiple = 0;
scanf("%d %d",&x,&y);
x1 = x > y ? x : y;
y1 = y >= x ? x : y;
while(x1%y1 != 0)
{
k = x1 % y1;
x1 = y1;
y1 = k;
}
maxdivisor = y1;
minmultiple = x * y / y1;
printf("最大公约数是 %d 最小公倍数是 %d ",maxdivisor ,minmultiple );
3.
int a[1001];
memset(a, 0, 1001);
for(int i = 2; i<=1000; i++)
a[i] =1;
for (int j= 2; j<1000; j++)
{
if (a[j] == 1)
{
for (int k = 2; k * j < 1001; k ++)
a[k*j] = 0;
printf(" %d " , j);
}
}
printf("\n");
4.
int g , s , b;
for(int i=100; i<999; i++)
{
g = i % 10;
s = i % 100 / 10;
b = i /100;
if ( g*g*g + s*s*s + b*b*b == i)
printf(" 仙花数 = %d\n", i);
}追问大哥剩余的几题也教教我吧
谢拉
神啊 救救我吧
热心网友 时间:2023-10-23 04:14
这些真的都是非常非常简单的程序
真的建议是自己动手做做看
再来对答案
下面我把我自己想的2-4题程序发来吧:
//2.我只编2个函数,主函数你自己写
int max(int a,int b)//求最大公约数,注意这个必须写在最小公倍数前面
{ int r;
if(a<b)
{r=a;a=b;b=r;}
while(r=a%b)
{a=b;b=r;}
return b;
}
int min(int a,int b)//求最小公倍数
{ return a*b/max(a,b);
}
//3.
int main()
{ int i,j;
cout<<"The prime between 2-1000 are:"<<endl;
for(i=2;i<=1000;++i)
{ for(j=2;j<i;++j)
if(i%j==0)
break;
if(j==i)
cout<<i<<' ';
}
cout<<endl;
}
//4.还是函数,主函数自己写吧,用个循环判断100-999是不是水仙花数,怎么判断就是调用函数就行了
bool shuixianhua(int a)
{ int i,j,k;
i=a/100;
j=a/10%10;
k=a%10;
if(a==i*i*i+j*j*j+k*k*k)
return true;
return false;
}
个人建议,想学好C语言和C++,程序还是自己写完再对答案,或者机子上跑跑看,这样还能积累经验
热心网友 时间:2023-10-23 04:14
1.
for(int i=0; i<20; i++)
{
for (int j= 0; j<34; j++)
{
for( int k = 0; k < 100; k+=3)
{
if(i+j+k == 100 && 5*i + 3*j + k/3 == 100)
{
printf("公鸡 = %d, 母鸡 = %d , 小鸡 = %d",i,j,k);
return ;
}
}
}
}
2.
int maxdivisor = 1, x, y,x1,y1,k;
int minmultiple = 0;
scanf("%d %d",&x,&y);
x1 = x > y ? x : y;
y1 = y >= x ? x : y;
while(x1%y1 != 0)
{
k = x1 % y1;
x1 = y1;
y1 = k;
}
maxdivisor = y1;
minmultiple = x * y / y1;
printf("最大公约数是 %d 最小公倍数是 %d ",maxdivisor ,minmultiple );
3.
int a[1001];
memset(a, 0, 1001);
for(int i = 2; i<=1000; i++)
a[i] =1;
for (int j= 2; j<1000; j++)
{
if (a[j] == 1)
{
for (int k = 2; k * j < 1001; k ++)
a[k*j] = 0;
printf(" %d " , j);
}
}
printf("\n");
4.
int g , s , b;
for(int i=100; i<999; i++)
{
g = i % 10;
s = i % 100 / 10;
b = i /100;
if ( g*g*g + s*s*s + b*b*b == i)
printf(" 仙花数 = %d\n", i);
}追问大哥剩余的几题也教教我吧
谢拉
神啊 救救我吧
热心网友 时间:2023-10-23 04:15
这个是考题吧?追问不是
是作业题
热心网友 时间:2023-10-23 04:13
其他的几个就然别人起坐吧,我就跟你讲一讲求素数的方法,
PS:素数应该来讲学过编程的人都会做,但是关键我在这里要说的就是效率问题,
不知道有没有国际最优,但我这个算法很顶尖了:计算1亿以内的素数个数不到2秒钟,记住是不到2秒钟。。。
#include<iostream>
using namespace std;
int main()
{int CompositeNumFilterV3(int);
int m,c;
cin>>m;
c=CompositeNumFilterV3(m);
cout<<c<<endl;
return 0;
}
//求素数的程序
int CompositeNumFilterV3(int n)
{
int i, j;
//素数数量统计
int count = 0;
// 分配素数标记空间,明白+1原因了吧,因为浪费了一个flag[0]
char* flag = (char*)malloc( n+1 );
// 干嘛用的,请仔细研究下文
int mpLen = 2*3*5*7*11*13;
char magicPattern[2*3*5*7*11*13]; // 奇怪的代码,why,思考无法代劳,想!
for (i=0; i<mpLen; i++)
{
magicPattern[i++] = 1;
magicPattern[i++] = 0;
magicPattern[i++] = 0;
magicPattern[i++] = 0;
magicPattern[i++] = 1;
magicPattern[i] = 0;
}
for (i=4; i<=mpLen; i+=5)
magicPattern[i] = 0;
for (i=6; i<=mpLen; i+=7)
magicPattern[i] = 0;
for (i=10; i<=mpLen; i+=11)
magicPattern[i] = 0;
for (i=12; i<=mpLen; i+=13)
magicPattern[i] = 0;
// 新的初始化方法,将2,3,5,7,11,13的倍数全干掉
// 而且采用memcpy以mpLen长的magicPattern来批量处理
int remainder = n%mpLen;
char* p = flag+1;
char* pstop = p+n-remainder;
while (p < pstop)
{
memcpy(p, magicPattern, mpLen);
p += mpLen;
}
if (remainder > 0)
{
memcpy(p, magicPattern, remainder);
}
flag[2] = 1;
flag[3] = 1;
flag[5] = 1;
flag[7] = 1;
flag[11] = 1;
flag[13] = 1;
// 从17开始filter,因为2,3,5,7,11,13的倍数早被kill了
// 到n/13止的,哈哈,少了好多吧
int stop = n/13;
for (i=17; i <= stop; i++)
{
// i是合数,请歇着吧,因为您的工作早有您的质因子代劳了
if (0 == flag[i]) continue;
// 从i的17倍开始过滤
int step = i*2;
for (j=i*17; j <= n; j+=step)
{
flag[j] = 0;
}
}
// 统计素数个数
for (i=2; i<=n; i++)
{
if (flag[i]) count++;
}
// 因输出费时,且和算法核心相关不大,故略
// 释放内存,别忘了传说中的内存泄漏
free(flag);
return count;
}
==============================
这个算法你拿给老师看,会把所有的算法题目全比下去,其他的题目也会黯然失色。有一个汇编语言版的,我在这里就不拿出来了, 因为看样子你也没学过汇编。那效率。。像飞机一样的快。追问拿这个给老师我就死定了
热心网友 时间:2023-10-23 04:14
1.
for(int i=0; i<20; i++)
{
for (int j= 0; j<34; j++)
{
for( int k = 0; k < 100; k+=3)
{
if(i+j+k == 100 && 5*i + 3*j + k/3 == 100)
{
printf("公鸡 = %d, 母鸡 = %d , 小鸡 = %d",i,j,k);
return ;
}
}
}
}
2.
int maxdivisor = 1, x, y,x1,y1,k;
int minmultiple = 0;
scanf("%d %d",&x,&y);
x1 = x > y ? x : y;
y1 = y >= x ? x : y;
while(x1%y1 != 0)
{
k = x1 % y1;
x1 = y1;
y1 = k;
}
maxdivisor = y1;
minmultiple = x * y / y1;
printf("最大公约数是 %d 最小公倍数是 %d ",maxdivisor ,minmultiple );
3.
int a[1001];
memset(a, 0, 1001);
for(int i = 2; i<=1000; i++)
a[i] =1;
for (int j= 2; j<1000; j++)
{
if (a[j] == 1)
{
for (int k = 2; k * j < 1001; k ++)
a[k*j] = 0;
printf(" %d " , j);
}
}
printf("\n");
4.
int g , s , b;
for(int i=100; i<999; i++)
{
g = i % 10;
s = i % 100 / 10;
b = i /100;
if ( g*g*g + s*s*s + b*b*b == i)
printf(" 仙花数 = %d\n", i);
}追问大哥剩余的几题也教教我吧
谢拉
神啊 救救我吧
热心网友 时间:2023-10-23 04:14
这些真的都是非常非常简单的程序
真的建议是自己动手做做看
再来对答案
下面我把我自己想的2-4题程序发来吧:
//2.我只编2个函数,主函数你自己写
int max(int a,int b)//求最大公约数,注意这个必须写在最小公倍数前面
{ int r;
if(a<b)
{r=a;a=b;b=r;}
while(r=a%b)
{a=b;b=r;}
return b;
}
int min(int a,int b)//求最小公倍数
{ return a*b/max(a,b);
}
//3.
int main()
{ int i,j;
cout<<"The prime between 2-1000 are:"<<endl;
for(i=2;i<=1000;++i)
{ for(j=2;j<i;++j)
if(i%j==0)
break;
if(j==i)
cout<<i<<' ';
}
cout<<endl;
}
//4.还是函数,主函数自己写吧,用个循环判断100-999是不是水仙花数,怎么判断就是调用函数就行了
bool shuixianhua(int a)
{ int i,j,k;
i=a/100;
j=a/10%10;
k=a%10;
if(a==i*i*i+j*j*j+k*k*k)
return true;
return false;
}
个人建议,想学好C语言和C++,程序还是自己写完再对答案,或者机子上跑跑看,这样还能积累经验
热心网友 时间:2023-10-23 04:14
这些真的都是非常非常简单的程序
真的建议是自己动手做做看
再来对答案
下面我把我自己想的2-4题程序发来吧:
//2.我只编2个函数,主函数你自己写
int max(int a,int b)//求最大公约数,注意这个必须写在最小公倍数前面
{ int r;
if(a<b)
{r=a;a=b;b=r;}
while(r=a%b)
{a=b;b=r;}
return b;
}
int min(int a,int b)//求最小公倍数
{ return a*b/max(a,b);
}
//3.
int main()
{ int i,j;
cout<<"The prime between 2-1000 are:"<<endl;
for(i=2;i<=1000;++i)
{ for(j=2;j<i;++j)
if(i%j==0)
break;
if(j==i)
cout<<i<<' ';
}
cout<<endl;
}
//4.还是函数,主函数自己写吧,用个循环判断100-999是不是水仙花数,怎么判断就是调用函数就行了
bool shuixianhua(int a)
{ int i,j,k;
i=a/100;
j=a/10%10;
k=a%10;
if(a==i*i*i+j*j*j+k*k*k)
return true;
return false;
}
个人建议,想学好C语言和C++,程序还是自己写完再对答案,或者机子上跑跑看,这样还能积累经验
热心网友 时间:2023-10-23 04:15
这个是考题吧?追问不是
是作业题
热心网友 时间:2023-10-23 04:14
1.
for(int i=0; i<20; i++)
{
for (int j= 0; j<34; j++)
{
for( int k = 0; k < 100; k+=3)
{
if(i+j+k == 100 && 5*i + 3*j + k/3 == 100)
{
printf("公鸡 = %d, 母鸡 = %d , 小鸡 = %d",i,j,k);
return ;
}
}
}
}
2.
int maxdivisor = 1, x, y,x1,y1,k;
int minmultiple = 0;
scanf("%d %d",&x,&y);
x1 = x > y ? x : y;
y1 = y >= x ? x : y;
while(x1%y1 != 0)
{
k = x1 % y1;
x1 = y1;
y1 = k;
}
maxdivisor = y1;
minmultiple = x * y / y1;
printf("最大公约数是 %d 最小公倍数是 %d ",maxdivisor ,minmultiple );
3.
int a[1001];
memset(a, 0, 1001);
for(int i = 2; i<=1000; i++)
a[i] =1;
for (int j= 2; j<1000; j++)
{
if (a[j] == 1)
{
for (int k = 2; k * j < 1001; k ++)
a[k*j] = 0;
printf(" %d " , j);
}
}
printf("\n");
4.
int g , s , b;
for(int i=100; i<999; i++)
{
g = i % 10;
s = i % 100 / 10;
b = i /100;
if ( g*g*g + s*s*s + b*b*b == i)
printf(" 仙花数 = %d\n", i);
}追问大哥剩余的几题也教教我吧
谢拉
神啊 救救我吧
热心网友 时间:2023-10-23 04:14
这些真的都是非常非常简单的程序
真的建议是自己动手做做看
再来对答案
下面我把我自己想的2-4题程序发来吧:
//2.我只编2个函数,主函数你自己写
int max(int a,int b)//求最大公约数,注意这个必须写在最小公倍数前面
{ int r;
if(a<b)
{r=a;a=b;b=r;}
while(r=a%b)
{a=b;b=r;}
return b;
}
int min(int a,int b)//求最小公倍数
{ return a*b/max(a,b);
}
//3.
int main()
{ int i,j;
cout<<"The prime between 2-1000 are:"<<endl;
for(i=2;i<=1000;++i)
{ for(j=2;j<i;++j)
if(i%j==0)
break;
if(j==i)
cout<<i<<' ';
}
cout<<endl;
}
//4.还是函数,主函数自己写吧,用个循环判断100-999是不是水仙花数,怎么判断就是调用函数就行了
bool shuixianhua(int a)
{ int i,j,k;
i=a/100;
j=a/10%10;
k=a%10;
if(a==i*i*i+j*j*j+k*k*k)
return true;
return false;
}
个人建议,想学好C语言和C++,程序还是自己写完再对答案,或者机子上跑跑看,这样还能积累经验
热心网友 时间:2023-10-23 04:15
这个是考题吧?追问不是
是作业题
热心网友 时间:2023-10-23 04:15
这个是考题吧?追问不是
是作业题