redraiment redraiment
关注数: 0 粉丝数: 31 发帖数: 1,043 关注贴吧数: 7
VB和Dev-C++合作——手把手教你写GUI程序 【声明】   此文的读者定为C语言初学者。此文介绍的技巧适用于开发迷你型项目或自娱自乐的玩具程序,正规的项目中可能不会采用。读者可以抱着茶余饭后休闲娱乐的心态来围观,至于CLI、GUI等名词解释请参看百度百科。转载请保留此声明和原作者redraiment,谢谢! 【诱人的GUI程序】   程序的作用就是化繁为简,让计算机高效地帮我们完成枯燥的工作。写程序最大的动力就是你精心设计的程序能获得大家的认可、大众的好评,这其中伴随着发布程序给大家使用。   在C语言编写的操作系统(比如UNIX、Windows等)上,C语言可以说是“无所不能”。但很多初学者发现,即便自己把C语言教材从头啃到尾,依然只能写出命令行下的程序。程序是CLI还是GUI本无可厚非,对我们程序员来说更重要的是程序本身提供的功能嘛,而且CLI相对于GUI还更灵活一些。也许你可以尝试一下把程序发送给一个非计算机科班出身的朋友,估计得大费唇舌来解释程序如何运行,可能最后还落得一个“不方便”的抱怨。撇开这些不说,至少一个活泼的桌面图标也比死气沉沉的终端图标更吸引人。   但编写GUI程序从来不是一件容易的事情,MFC也好、Swing也罢,都是一堆烦人的接口。用VB可以屏蔽这些细节,界面设计是所见即所得的,拖拖拽拽就能堆出一个像样的界面。本文的原理就是用VB来设计前台界面,C做后台逻辑处理。实现方法就是将C程序打包成DLL文件,由VB程序来调用。 【所需软件】   Dev-C++ 4.9.9.2或以上版本,VB 6.0精简版。这两款软件在华军软件园都能下载到,合起来大小也就15MB左右。如果你有完整版的VB当然更好,不过有精简版的也够用了。
ZT:[程序员必看]请不要做浮躁的人 刚在一个群里看到,觉得很有道理,发给大家共勉.  1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么。当你自己想出来再参考别人的提示,你就知道自己和别人思路的差。  2.初学者请不要看太多太多的书那会误人子弟的,先找本系统的学,很多人用了很久都是只对部分功能熟悉而已,不系统还是不够的。   3.看帮助,不要因为很难而自己是初学者所以就不看;帮助永远是最好的参考手册,虽然帮助的文字有时候很难看懂,总觉得不够直观。   4.不要被对象、属性、方法等词汇所迷惑;最根本的是先了解最基础知识。   5.不要放过任何一个看上去很简单的小问题--他们往往并不那么简单,或者可以引伸出很多知识点;不会举一反三你就永远学不会。   6.知道一点东西,并不能说明你会写脚本,脚本是需要经验积累的。   7.学脚本并不难,JSP、ASP、PHP等等也不过如此--难的是长期坚持实践和不遗余力的博览群书;   8.看再多的书是学不全脚本的,要多实践。  9.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;   10.学习脚本最好的方法之一就是多练习;   11.在任何时刻都不要认为自己手中的书已经足够了;   12.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;   13.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;   14.请把书上的例子亲手到电脑上实践,即使配套光盘中有源文件;   15.把在书中看到的有意义的例子扩充;并将其切实的运用到自己的工作中;   16.不要漏掉书中任何一个练习——请全部做完并记录下思路;  17.当你用脚本到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个代码的完整性,然后分析自己的错误并重新编写和工作。  18.别心急,写脚本确实不容易;水平是在不断的实践中完善和发展的;   19.每学到一个脚本难点的时候,尝试着对别人讲解这个知识点并让他理解----你能讲清楚才说明你真的理解了;   20.记录下在和别人交流时发现的自己忽视或不理解的知识点;   21.保存好你做过的所有的源文件----那是你最好的积累之一;   22.对于网络,还是希望大家能多利用一下,很多问题不是非要到论坛来问的,首先你要学会自己找答案,比如google、百度都是很好的搜索引擎,你只要输入关键字就能找到很多相关资料,别老是等待别人给你希望,看的出你平时一定也很懒!   23,到一个论坛,你学会去看以前的帖子,不要什么都不看就发帖子问,也许你的问题早就有人问过了,你再问,别人已经不想再重复了,做为初学者,谁也不希望自己的帖子没人回的。  24,虽然不是打击初学者,但是这句话还是要说:论坛论坛,就是大家讨论的地方,如果你总期望有高手总无偿指点你,除非他是你亲戚!!讨论者,起码是水平相当的才有讨论的说法,如果水平真差距太远了,连基本操作都需要别人给解答,谁还跟你讨论呢。能找到很多相关资料,别老是等待别人给你希望,看的出你平时一定也很懒!     浮躁的人容易问:我到底该学什么;----别问,学就对了;   浮躁的人容易问:JS(NET)有钱途吗;----建议你去抢银行;   浮躁的人容易说:我要中文版!我英文不行!----不行?学呀!   浮躁的人分两种:只观望而不学的人;只学而不坚持的人;   浮躁的人永远不是一个高手。
请路过的朋友来帮个忙 IT人员收入调查简表注:感谢您在百忙中参与我们的调查。我大二的学生,我的专业是软件工程。这是我们的社会调查作业,我们这次的课题是调查城乡居民收入。我们和我的队友希望借这次调查,来了解一下我们自己专业未来的发展情况。因此决定调查对象就是我们的IT人员。考虑到收入是一个比较敏感的私人问题,因此我们采用不署名调查。但如果您愿意,可以提供我们您所在的单位等信息,如果您不愿公开自己的答案,请发送到我们的邮箱[email protected]。再次感谢您!您的性别( )A. 男B. 女 您的年龄( )A. 20~25B. 25~30C. 30~35D. 35 以上您每个月的月收入范围是( )A. 1000~3000B. 3000~5000C. 5000~8000D. 8000 以上您在公司的主要职务是( )A. 软件蓝领B. 软件白领C. 部门经理D. 董事长您在公司每天的工作时间为( )A. 5小时以下B. 5~8小时C. 8~10 小时D. 10小时以上您的年终奖金范围在多少( )A. 1000~5000B. 5000~8000C. 8000~10000D. 10000 以上除了正规的工资收入,您每月的其他收入,例如证券投资等来源范围( )A. 1000~3000B. 3000~5000C. 5000~8000D. 8000 以上与当地的普通消费水平相比,您认为您的收入情况( )A. 很好B. 较好C. 一般D. 差请简单的描述一下您对您当前收入的看法________________________________________________________________________________________________________________________________________________________________如果方便,请留下您所在公司的名称______。再次感谢您的参与,祝您工作顺利,生活愉快!
请路过的朋友来帮个忙 IT人员收入调查简表注:感谢您在百忙中参与我们的调查。我大二的学生,我的专业是软件工程。这是我们的社会调查作业,我们这次的课题是调查城乡居民收入。我们和我的队友希望借这次调查,来了解一下我们自己专业未来的发展情况。因此决定调查对象就是我们的IT人员。考虑到收入是一个比较敏感的私人问题,因此我们采用不署名调查。但如果您愿意,可以提供我们您所在的单位等信息,如果您不愿公开自己的答案,请发送到我们的邮箱[email protected]。再次感谢您!您的性别( )A. 男B. 女 您的年龄( )A. 20~25B. 25~30C. 30~35D. 35 以上您每个月的月收入范围是( )A. 1000~3000B. 3000~5000C. 5000~8000D. 8000 以上您在公司的主要职务是( )A. 软件蓝领B. 软件白领C. 部门经理D. 董事长您在公司每天的工作时间为( )A. 5小时以下B. 5~8小时C. 8~10 小时D. 10小时以上您的年终奖金范围在多少( )A. 1000~5000B. 5000~8000C. 8000~10000D. 10000 以上除了正规的工资收入,您每月的其他收入,例如证券投资等来源范围( )A. 1000~3000B. 3000~5000C. 5000~8000D. 8000 以上与当地的普通消费水平相比,您认为您的收入情况( )A. 很好B. 较好C. 一般D. 差请简单的描述一下您对您当前收入的看法________________________________________________________________________________________________________________________________________________________________如果方便,请留下您所在公司的名称______。再次感谢您的参与,祝您工作顺利,生活愉快!
请路过的朋友来帮个忙 IT人员收入调查简表注:感谢您在百忙中参与我们的调查。我大二的学生,我的专业是软件工程。这是我们的社会调查作业,我们这次的课题是调查城乡居民收入。我们和我的队友希望借这次调查,来了解一下我们自己专业未来的发展情况。因此决定调查对象就是我们的IT人员。考虑到收入是一个比较敏感的私人问题,因此我们采用不署名调查。但如果您愿意,可以提供我们您所在的单位等信息,如果您不愿公开自己的答案,请发送到我们的邮箱[email protected]。再次感谢您!您的性别( )A. 男B. 女 您的年龄( )A. 20~25B. 25~30C. 30~35D. 35 以上您每个月的月收入范围是( )A. 1000~3000B. 3000~5000C. 5000~8000D. 8000 以上您在公司的主要职务是( )A. 软件蓝领B. 软件白领C. 部门经理D. 董事长您在公司每天的工作时间为( )A. 5小时以下B. 5~8小时C. 8~10 小时D. 10小时以上您的年终奖金范围在多少( )A. 1000~5000B. 5000~8000C. 8000~10000D. 10000 以上除了正规的工资收入,您每月的其他收入,例如证券投资等来源范围( )A. 1000~3000B. 3000~5000C. 5000~8000D. 8000 以上与当地的普通消费水平相比,您认为您的收入情况( )A. 很好B. 较好C. 一般D. 差请简单的描述一下您对您当前收入的看法________________________________________________________________________________________________________________________________________________________________如果方便,请留下您所在公司的名称______。再次感谢您的参与,祝您工作顺利,生活愉快!
请路过的朋友来帮个忙 IT人员收入调查简表注:感谢您在百忙中参与我们的调查。我大二的学生,我的专业是软件工程。这是我们的社会调查作业,我们这次的课题是调查城乡居民收入。我们和我的队友希望借这次调查,来了解一下我们自己专业未来的发展情况。因此决定调查对象就是我们的IT人员。考虑到收入是一个比较敏感的私人问题,因此我们采用不署名调查。但如果您愿意,可以提供我们您所在的单位等信息,如果您不愿公开自己的答案,请发送到我们的邮箱[email protected]。再次感谢您!您的性别( )A. 男B. 女 您的年龄( )A. 20~25B. 25~30C. 30~35D. 35 以上您每个月的月收入范围是( )A. 1000~3000B. 3000~5000C. 5000~8000D. 8000 以上您在公司的主要职务是( )A. 软件蓝领B. 软件白领C. 部门经理D. 董事长您在公司每天的工作时间为( )A. 5小时以下B. 5~8小时C. 8~10 小时D. 10小时以上您的年终奖金范围在多少( )A. 1000~5000B. 5000~8000C. 8000~10000D. 10000 以上除了正规的工资收入,您每月的其他收入,例如证券投资等来源范围( )A. 1000~3000B. 3000~5000C. 5000~8000D. 8000 以上与当地的普通消费水平相比,您认为您的收入情况( )A. 很好B. 较好C. 一般D. 差请简单的描述一下您对您当前收入的看法________________________________________________________________________________________________________________________________________________________________如果方便,请留下您所在公司的名称______。再次感谢您的参与,祝您工作顺利,生活愉快!
请路过的朋友来帮个忙 IT人员收入调查简表注:感谢您在百忙中参与我们的调查。我大二的学生,我的专业是软件工程。这是我们的社会调查作业,我们这次的课题是调查城乡居民收入。我们和我的队友希望借这次调查,来了解一下我们自己专业未来的发展情况。因此决定调查对象就是我们的IT人员。考虑到收入是一个比较敏感的私人问题,因此我们采用不署名调查。但如果您愿意,可以提供我们您所在的单位等信息,如果您不愿公开自己的答案,请发送到我们的邮箱[email protected]。再次感谢您!您的性别( )A. 男B. 女 您的年龄( )A. 20~25B. 25~30C. 30~35D. 35 以上您每个月的月收入范围是( )A. 1000~3000B. 3000~5000C. 5000~8000D. 8000 以上您在公司的主要职务是( )A. 软件蓝领B. 软件白领C. 部门经理D. 董事长您在公司每天的工作时间为( )A. 5小时以下B. 5~8小时C. 8~10 小时D. 10小时以上您的年终奖金范围在多少( )A. 1000~5000B. 5000~8000C. 8000~10000D. 10000 以上除了正规的工资收入,您每月的其他收入,例如证券投资等来源范围( )A. 1000~3000B. 3000~5000C. 5000~8000D. 8000 以上与当地的普通消费水平相比,您认为您的收入情况( )A. 很好B. 较好C. 一般D. 差请简单的描述一下您对您当前收入的看法________________________________________________________________________________________________________________________________________________________________如果方便,请留下您所在公司的名称______。再次感谢您的参与,祝您工作顺利,生活愉快!
珊瑚虫版QQ被判侵权可能将停止更新   业内猜测可能是担忧激起珊瑚虫版QQ老用户的抵触情绪,腾讯在胜诉后采取了低调处理的态度,近日才由知情人士将该案判决结果公诸于众。腾讯公司发言人27日下午对新浪科技表示,陈寿福服从法院判决,已支付赔偿并在网站道歉。  据了解,腾讯公司2006年8月20日对珊瑚虫版QQ的作者陈寿福提起诉讼,认为珊瑚虫版QQ已侵犯腾讯的著作权,并有不正当竞争行为,要求陈寿福公开赔礼道歉,并赔偿腾讯经济损失人民币50万元。珊瑚虫版QQ在腾讯即时通讯软件QQ的基础上增加了现实IP地址、去除广告等特性,受到很多用户的欢迎,很多用户不安装官方版本的QQ软件,而安装珊瑚虫QQ。  虽然陈寿福在使用协议中表示珊瑚虫版QQ“仅为方便用户使用之辅助工具,没有任何侵权意图”,但法院认为腾讯对QQ享有计算机软件著作权,陈寿福未经许可修改QQ并在其网站“珊瑚虫工作室”中提供相关下载服务行为已构成侵权。法院最终裁定陈寿福开发珊瑚虫版QQ侵犯腾讯著作权,但驳回了腾讯指其不正当竞争行为的要求,并将赔偿额定为10万元人民币。  在珊瑚虫工作室的官方论坛上,有不少用户对腾讯赢得官司表示失望,甚至有用户称如果珊瑚虫版QQ停止更新,将不再使用QQ。腾讯公司发言人对此表示,珊瑚虫QQ软件等非官方版本将会带来极大的安全性问题,希望用户采用官方版本。对于与珊瑚虫版QQ类似的非官方软件,腾讯也将继续用法律维护其合法权益。  陈寿福是北京理工大学计算中心的老师,最早于2001年推出珊瑚虫版QQ,并随着QQ的升级也不断更新。2002年11月,陈寿福曾发表声明称将停止更新和传播珊瑚虫版QQ,并对腾讯保证不再对腾讯QQ软件作出任何修改,但2003年后再度开始更新珊瑚虫版QQ。值得一提的是,和珊瑚虫版QQ类似的木子版QQ在2003年6月由于受到腾讯的压力而停止更新,木子版QQ曾经比珊瑚虫版QQ更为流行。  目前,珊瑚虫工作室的官方网站上已经不再提供珊瑚虫版QQ的下载,而只有“珊瑚虫增强包”、“珊瑚虫工具栏”等没有更改QQ安装软件本身的插件下载。一位知情人士表示,由于此次官司败诉,珊瑚虫工作室可能将停止珊瑚虫版QQ的更新,而只保留“珊瑚虫增强包”等不更改QQ软件的插件,以规避法律风险。(朱庸)
简易计算器程序 /*************************************************\ *                        * * Writer  : ZJGSU redraiment          * * Usage  : 计算的表达式可以直接以命令行参数的 * *      形式输入,如果没有参数,程序会提示 * *      要求输入计算的式子         * * Function : 简单的计算器程序。有运算优先级。  * *      可以做+、-、*、/、(),的运算。   * *      ()可以多层嵌套。如:2*(1+2*(3-1))。 * *      也可以处理负数。如:-1*-3=(-1)*(-3) * * Faults  : 程序设计得很简单,有很多不足的地方 * *      本程序健壮性不强,对错误的数据不做 * *      出处理,它假定用户输入的都是正确的 * *      数据。而且本人的测试数据毕竟有限, * *      不能发现所有错误。如果你发现了本程 * *      序存在计算方面的错误,欢迎通知我。 * * E-mail  : [email protected]         * * HomePage : http://hi.baidu.com/redraiment/  * *                        *\*************************************************/#include #include #include int   tops = 0;int   topn = -1;char  cal[256] = {'0'};char  sym[128] = {'#'};double num[128] = {0.0};/*判断运算符优先级*/int compare(char symbol){    int   jud = 0;    switch (symbol)    {        case '(':            jud = 1;            break;        case '*':        case '/':            jud = sym[tops] == '/'?-1:1;            break;        case ')':            jud = 0;            break;        case '+':        case '-':            jud = (sym[tops] != '*' && sym[tops] != '/')?1:-1;            break;        default:            break;    }    return jud;}void calculate(double num1, char symbol, double num2){    if (symbol == '+')        num[--topn] = num1 + num2;    else if (symbol == '-')        num[--topn] = num1 - num2;    else if (symbol == '*')        num[--topn] = num1 * num2;    else if (symbol == '/')        num[--topn] = num1 / num2;}/*把表达式转换成波兰式*/void change(char *work){    int   cmp = 0;    int   neg = 0;    char  tmp;    char  *ptr = work;    char  *string = "-+*/()";    while (ptr = strpbrk(work, string))    {        if ( !(cmp = compare(*ptr)) )        {            if (strcmp(ptr, work))            {                *ptr = '\0';                num[++topn] = neg?neg = 0, -(atof(work)):(atof(work));            }            while (sym[tops] != '(')                calculate(num[topn-1], sym[tops--], num[topn]);            tops--;        }        else        {            if (!strcmp(ptr, work) && *ptr == '-')            {                neg = 1;            }            else            {                tmp = sym[++tops] = *ptr;                if (strcmp(ptr, work))                {                    *ptr = '\0';                    num[++topn] = neg?neg = 0, -(atof(work)):(atof(work));                }                if (cmp < 0)                {                    while (cmp < 0)                    {                        calculate(num[topn-1], sym[--tops], num[topn]);                        cmp = compare(tmp);                    }                    sym[++tops] = tmp;                }            }        }        work = ptr + 1;    }    if(*work)        num[++topn] = neg?-(atof(work)):(atof(work));    while (topn)        calculate(num[topn-1], sym[tops--], num[topn]);}int main(int argc, char *argv[]){    char  string[256];    if (argc < 2)    {        printf("请输入计算式:\n");        scanf("%[0123456789-+*/().]", cal);    }    else        sscanf(argv[1],"%[0123456789-+*/().]", cal);    strcpy(string, cal);    change(cal);    printf("%s = %.10g\n", string, num[0]);    return 0;}
简单的小程序(打印出螺旋行的矩阵) 运行结果:please input a number between 1 to 99101   2   3   4   5   6   7   8   9   1036  37  38  39  40  41  42  43  44  1135  64  65  66  67  68  69  70  45  1234  63  84  85  86  87  88  71  46  1333  62  83  96  97  98  89  72  47  1432  61  82  95  100 99  90  73  48  1531  60  81  94  93  92  91  74  49  1630  59  80  79  78  77  76  75  50  1729  58  57  56  55  54  53  52  51  1828  27  26  25  24  23  22  21  20  19Press any key to continue程序清单#include int n;int count=1;int a[100][100]={0};void eva(int x){        register        int     i=x;        register        int     j=x;        if(2*x>n)                a[i][j]=count++;        else        {                for(;j<=n-x;j++)                        a[i][j]=count++;                for(;i<=n-x;i++)                        a[i][j]=count++;                for(;j>x;j--)                        a[i][j]=count++;                for(;i>x;i--)                        a[i][j]=count++;        }}int main(void){        int        y=1;        register        int     i;        register        int     j;        printf("please input a number between 1 to 99\n");        while(scanf("%d",&n),n>99 || n<1);        while(y<=n/2+n%2)                eva(y++);        for(i=1;i<=n;i++)        {                for(j=1;j<=n;j++)                        printf("%-4d",a[i][j]);                putchar('\n');        }        return 0;}
我本学期所有的实验报告 我是软件工程的大一新生,这学期刚学完C语言。下面是我们这学期9次上机实验的实验报告。贴出来供大家参考。所有代码均在VC++6.0环境编译通过。因为是用ANSI C写的,在TC下应该也没问题(我没试过)。更多信息请浏览我的空间http://hi.baidu.com/redraiment/计算机与信息工程学院实验报告(1)熟悉上机环境(VC++)和简单表达式计算。实验内容:表达式计算,简单程序调试1、编写一个输出一句话的程序,上机调试,熟悉系统的各个有关程序的编辑和编译命令的使用。2、完成3个数据的输入、求和,并输出计算结果的程序。要求:请同学把预备知识、步骤、程序框图、调试好的程序及存在的问题写在下面(不够可以附页)。附:#1.c#include void main(){        printf("Hello redraiment!\n");} #2.c#include void main(){        double count1=0,count2=0;        double sum=0;        printf("请输入两个数,系统将自动求和\n");        scanf("%le%le",&count1,&count2);        sum=count1+count2;        printf("%g+%g=%g\n",count1,count2,sum);}计算机与信息工程学院实验报告(2)实验内容及要求:了解基本的表达式语句和分支语句的使用,写5个表达式,要求运算符各不相同。 上机实验要求:1、写一个输入7个数据的程序,把输入的数据代入a+b*(c-d)/e*f-g表达式进行运算。2、输出计算的结果。3、编写一个程序完成输入一个整数,输出它的符号。4、  y=   x       (x<1) 2x-1    (1<=x<10) 3x-11   (x>=10) 有一函数如下:试编程根据输入的x的值计算出y的值。要求:请同学把预备知识、步骤、程序框图、调试好的程序及存在的问题写在下面(不够可以附页)。  #1.c#include void main(){        double a,b,c,d,e,f,g;        double sum;        printf("请输入7个数据\n");        scanf("%le%le%le%le%le%le%le",&a,&b,&c,&d,&e,&f,&g);        sum=a+b*(c-d)/e*f-g;        printf("结果为:%g\n",sum);}#2.c#include void main(){        int n;        printf("请输入一个整数\n");        scanf("%d",&n);        if(n>0)                printf("%d为正数\n",n);        else if(n==0)                printf("%d为零\n",n);        else                printf("%d为负数\n",n);}#3.c#include
[原创]求质数(C语言描述) [原创]求质数(C语言描述)【问题描述】: 试编写一个程序,找出2->N之间的所有质数。希望用尽可能快的方法实现。【问题分析】: 这个问题可以有两种解法:一种是用“筛子法”,另一种是从2->N检查,找出质数。 先来简单介绍一下“筛法”,求2~20的质数,它的做法是先把2~20这些数一字排开: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 先取出数组中最小的数,是2,则判断2是质数,把后面2的倍数全部删掉。 2 | 3 5 7 9 11 13 15 17 19 接下来的最小数是3,取出,再删掉3的倍数 2 3 | 5 7 11 13 17 19 一直这样下去,直到结束。 筛法求质数的问题时,非质数的数据有很多是重复的。例如,如果有一个数3×7×17×23,那么在删除3的倍数时会删到它,删7、17、23时同样也会删到它。有一种“线性筛法”,可以安排删除的次序,使得每一个非质数都只被删除一次。从而提高效率。因为“筛法”不是我要介绍的重点,所以就不介绍了。 现在我来介绍第二种方法。用这种方法,最先想到的就是让从2~N逐一检查。如果是就显示出来,如果不是,就检查下一个。这是正确的做法,但效率却不高。当然,2是质数,那么2的倍数就不是质数,如果令i从2到N,就很冤枉地测试了4、6、8……这些数?所以第一点改建就是只测试2与所有的奇数就足够了。同理,3是质数,但6、9、12……这些3的倍数却不是,因此,如果能够把2与3的倍数跳过去而不测试,任意连续的6个数中,就只会测试2个而已。以6n,6n+1,6n+2,6n+3,6n+4,6n+5为例,6n,6n+2,6n+4是偶数,又6n+3是3的倍数,所以如果2与3的倍数都不理会,只要测试的数就只留下6n+1和6n+5而已了,因而工作量只是前面想法的2/6=1/3,应该用这个方法编程。 还有个问题,就是如果判断一个数i是否为素数。按素数的定义,也就是只有1与本身可以整除,所以可以用2~i-1去除i,如果都除不尽,i就是素数。观点对,但却与上一点一样的笨拙。当i>2时,有哪一个数可以被i-1除尽的?没有,为什么?如果i不是质数,那么i=a×b,此地a与b既不是i又不是1;正因为a>1,a至少为2,因此b最多也是i/2而已,去除i的数用不着是2~i-1,而用2~i/2就可以了。不但如此,因为i=a×b,a与b不能大于sqrt(i),为什么呢?如果a>sqrt(i),b>sqrt(i),于是a×b>sqrt(i)*sqrt(i)=i,因此就都不能整除i了。如果i不是质数,它的因子最大就是sqrt(i);换言之,用2~sqrt(i)去检验就行了。 但是,用2~sqrt(i)去检验也是浪费。就像前面一样,2除不尽,2的倍数也除不尽;同理,3除不尽,3的倍数也除不尽……最理想的方法就是用质数去除i。 但问题是这些素数从何而来?这比较简单,可以准备一个数组prime[],用来存放找到的素数,一开始它里面有2、3、5。检查的时候,就用prime[]中小于sqrt(i)的数去除i即可,如果都除不尽,i就是素数,把它放如prime[]中,因此prime[]中的素数会越来越多,直到满足个数为止! 不妨用这段说明来编写这个程序,但是程序设计的时候会有两个小问题: 1.如果只检查6n+1和6n+5?不难发现,它们的距离是4、2、4、2……所以,可以先定义一个变量gab=4,然后gab=6-gab; 2.比较是不能用sqrt(i),因为它不精确。举个例子,i=121,在数学上,sqrt(i)自然是11,但计算机里的结果可能是10.9999999,于是去除的数就是2、3、5、7,而不含11,因此121就变成质数了。解决这个问题的方法很简单,不要用开方,用平方即可。例如,如果p*p<=i,则就用p去除i。而且它的效率比开方高。【程序清单】:#include int creat_prime(int prime[],int n,int total){ register int i; register int j; register int gab=2; register int count; for(i=7;i<=n;i+=gab) { count=1; gab=6-gab; for(j=0;prime[j]*prime[j]<=i;j++) { if(i%prime[j]==0) { count=0; break; } } if(count) { prime[total]=i; total++; } } return total;}int main(void){ int prime[30000]={2,3,5}; int total=3; //找到素数的个数 int i; int n=200000; //要查找的范围(>=6) total=creat_prime(prime,n,total); for(i=0;i 1.txt这样就可以把结果保存到1.txt。你会发现在int越界的前提下,它几乎都是瞬间完成的!当然这段程序还是有可以改进的地方,如果你有更好的建议,请联系我。[email protected]
1 下一页