电脑C语言编程,求高手帮忙

来自:    更新日期:早些时候
c语言高手进 编程 c++ 帮忙 电脑~

其他的几个就然别人起坐吧,我就跟你讲一讲求素数的方法,
PS:素数应该来讲学过编程的人都会做,但是关键我在这里要说的就是效率问题,
不知道有没有国际最优,但我这个算法很顶尖了:计算1亿以内的素数个数不到2秒钟,记住是不到2秒钟。。。
#include
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;
}




==============================
这个算法你拿给老师看,会把所有的算法题目全比下去,其他的题目也会黯然失色。有一个汇编语言版的,我在这里就不拿出来了, 因为看样子你也没学过汇编。那效率。。像飞机一样的快。

几乎所有硬件配置都是可以的,而且任何操作系统都是可以的,都有自己的开发环境。一些主流的开发环境也是比较好的,如:Qt Creator、GCC等都是在Windows和Linux中都能看到的熟悉身影。

1.
#include<stdio.h>
void main()
{
int n[8],maxn=0,minn=0,detn;
float score[8],max,min,aver=0.0,det,detm;
printf("输入裁判号及分数:\n");
scanf("%d%f",&n[0],&score[0]);
max=min=score[0];
for(int i=1;i<8;i++)
{
scanf("%d%f",&n[i],&score[i]);
if(max<score[i])
{
max=score[i];
maxn=i;
}
if(min>score[i])
{
min=score[i];
minn=i;
}
}
score[maxn]=score[minn]=0.0;
for(i=0;i<8;i++) aver+=score[i];
aver/=6.0;
printf("平均分:%f\n",aver);
detm=aver;
detn=maxn;
for(i=0;i<8;i++)
{
det=aver-score[i];
if(det<0) det=-det;
if(detm>det) {
detm=det;
detn=i;
}
}
printf("最接近裁判:%d,评分:%f\n",n[detn],score[detn]);
}
2.

#include<stdio.h>
void main()
{
int a,b,s=1;
scanf("%d%d",&a,&b);
printf("%d:",a);
for(int i=1;i<=a;i++)
{
if(a%i==0)
{
for(int j=2;j<i;j++)
{
if(i%j==0) break;
}
if(j>=i)
{
s*=i;
printf("%d*",i);
}
}

}
printf("\b=%d,",s);
if(s==b) printf("OK\n");
else printf("Err(%d!=%d)\n",s,b);

}
3.
#include<stdio.h>
void main()
{
int men,women,children,i=0;
for(men=1;men<30;men++)
for(women=1;women<30;women++)
for(children=1;children<30;children++)
{
if(men+women+children==30&&men*3+women*2+children==50)
{
i++;
printf("%d.men:%d,women:%d,children:%d,",i,men,women,children);
printf("%d*3+%d*2+%d*1=50\n",men,women,children);
}
}

}

这些题目都不难,如果只有一道题的话,我会帮你写。只是花时间就行。我可以给你思路,你自己写。1.定义一个结构体,包含裁判员号和分数,将所有的输入放在一个数组里(定义一个结构体数组);2.先求出a的所有因子,接着判断是否为质数,是就累乘起来,然后将结果与b比较;可以将质数的判断定义为一个子函数,然后调用。3.这题最简单了,假设男人x人,女人y人,小孩z人,用3个for循环分别对三个变量增加,在最里层的for循环里进行两个条件判断,为真者输出;
这样思路够清晰了吧,还不会的话就没办法了。不要太懒,自己动手写写。

下午上课,先帮你解决第3题。
程序如下:
#include<stdio.h>
void main()
{int m,w,c;
for(m=0;m<=10;m++)
{w=20-2*m;
c=10+m;
printf("男人%d人 女人%d人 小孩%d人\n",m,w,c);
}
}
思路是:设m代表男人数目,w代表女人数目,c代表小孩数目
则根据题意列方程组 m+w+c=30 3*m+2*w+c=50 联立方程求得2*m+w=20 所以0=<m<=10讨论即可 如果要求认输不为零,则将m改成从1开始即可。
希望帮到你 有时间我会继续做其他两题

考虑中..

第一题
Linking...
LINK : fatal error LNK1104: cannot open file "Debug/4.exe"
执行 link.exe 时出错.

4.exe - 1 error(s), 0 warning(s)
第三题
Linking...
LINK : fatal error LNK1104: cannot open file "Debug/12.exe"
执行 link.exe 时出错.

12.exe - 1 error(s), 0 warning(s)
好的,呵呵


电脑C语言编程,求高手帮忙视频

相关评论:
  • 18310279045求高手进来用C语言编出一个数学计算器程序
    籍卿彭case 3:c=a+b;printf("结果为%d\\n",c);break;case 4:c=a-b;printf("结果为%d\\n",c);break;} } }

  • 18310279045四个c语言编程题,求高手的帮助。谢谢!!
    籍卿彭\/*#include <stdio.h> int main(){ int a[5], i, num = 0;for(i = 0; i < 5; ++i){ scanf("%d", &a[i]);if (a[i] >= 60)num++;} printf("%d,%d%%", num, num*20);}*\/ \/*#include<stdio.h> int main(){ int a[5], i, num = 0, max = 0;for(i =...

  • 18310279045C语言编程 求S=aa….a(n个a) -… -aaa - aa - a的值 , 其中a=3,n=6...
    籍卿彭for(z=1;z<n-1;z++){ a=a*10+t;s1=s1-a; } 这段的意思应该是把 -… -aaa - aa - a的值算出来,换成 for(z=1;z<n-1;z++){s1=s1-a;a=a*10+t;} 然后:for(z=1;z<n;z++){a=a*10+t;s2=a;} 这段意思是算aaaa(n个a),因为a变量在之前的循环已经变成了aaaa...

  • 18310279045C语言高手请帮忙!!!
    籍卿彭ch=getchar();ch>='A'&&ch<='Z'?printf("%c\\n",ch+32):(ch>='a'&&ch<='z'?printf("%c\\n",ch-32):printf("%c\\n",ch));getch();} ___回复3:输入一个正整数n (1<n≤10),再输入n个整数,要求 ⑴ 求这n个数的平均值和最大值。⑵ 按逆序输出这n个数。⑶ 将最小...

  • 18310279045C语言,求高手帮忙。明天要考试了,帮帮忙吧!不胜感激!
    籍卿彭只需要从头开始找到这个数之后把这个位置之后的元素依次前移一个位置就好 include <stdio.h>int main(){ int myarray[10]; int i, j, n; \/\/初始化数组 for (i = 0; i < 10; i ++) myarray[i] = i; printf("Please input a number between 0 ~ 9: "); sc...

  • 18310279045C语言编程 求高手指点!!!为什么运行结果4.00000000啊,错在哪?
    籍卿彭m=m+i*o; if(o<=1e-6)break; i=-i; n=n+2; } printf("π=%f\\n",4*m); return 0;}算o的时候,1\/n两遍都是整型,只会按照整型方式来计算,当n大于1时,得到的结果都为0。所以把1改为浮点型的1.0,就可以让n也按照浮点型来计算了。

  • 18310279045给出坐标的几点之间的最短路径问题 用C语言解 求高手帮忙
    籍卿彭求剩余n-1个点中最近距离,递推直到剩下两个点,算法结束 \/ int getShortest(int *x,int *y,int n,int &minP1,int &minP2){ int *px,*py,*currX,*currY;int minX,minY;\/\/当前点与第一个点之间的坐标差值 minX = abs(*(x+1) - *x);minY = abs(*(y+1) - *y);\/\/坐标...

  • 18310279045C语言简单编程题目两道,求高手做一下。高分!!!
    籍卿彭define MAX 200 int main(void){ int a[MAX], i = 0;srand(time(NULL)); \/\/ 时间种子, 保证真随机, 每次不会相同 while (i < MAX) { a[i] = rand() % 10000; \/\/ 随机获得10000以下数字, 0-9999 if (a[i] < 1000) { \/\/ 不是4位数 continue; \/\/ 重新随机 } i...

  • 18310279045c语言编程问题,求高手解答(高分)
    籍卿彭你的程序没有大的问题,可以执行,只是以下几个小问题:一、第一行包含的文件不存在,这一行应该删除。二、定义了argc、argv两个变量没有使用,编译会有警告,可以删除他们或者不管,最好改为:int main()三、scanf输入n和k的时候,中间有个逗号分隔,这样输入的时候会麻烦,最好改为:scanf("%d%d...

  • 18310279045[急求助]C语言程序编程题,请高手帮忙解答下。!
    籍卿彭void fun(int a,int b,long c){ c=a%10*100+a\/10+b\/10*1000+b%10*10;\/*解释:a%10的意思是a除以10剩下的余数,即a的个位数,若a是45,a%10就是5,再乘以100即是500;a\/10就是十位数,即4,原因是它是向下取整,45\/10虽是4.5,但向下取整就将小数点后的都等于零;b\/10和上面...

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网