用VBA,MATLAB,C 从小到大生成质数表(源代码)
2016-04-15 15:47
513 查看
代码都是调试通过的。
本算法直接跳过了所有的偶数和个位为5的奇数,即只测试个位为1、3、7、9的整数n是不是质数。测试n是否为质数时,不是测试3~sqrt(n)之间的全部整数,而是测试3~sqrt(n)之间的全部质数,勉强算是比较高效的算法。
本算法直接跳过了所有的偶数和个位为5的奇数,即只测试个位为1、3、7、9的整数n是不是质数。测试n是否为质数时,不是测试3~sqrt(n)之间的全部整数,而是测试3~sqrt(n)之间的全部质数,勉强算是比较高效的算法。
Option Explicit '有很多变量本应是(长)整型,但VBA中长整型范围只有±2^31=±2147483648,太小了 '所以干脆直接来Double,可达±10^308 Public dRoot As Double, obCopy As Object, sN As String, sEveryLine As String, dCurNum As Double Public PrimeNumFileHead As Object, PrimeNumFileTail As Object, fs As Object, SavePath As String Sub generatePrime() Dim dRange As Double, dCount As Double Set fs = CreateObject("scripting.filesystemobject") SavePath = "E:\PrimeNum.txt" Set PrimeNumFileHead = fs.createtextfile(SavePath, True) dRange = 1000 '生成大于2且小于等于dRange的全部质数 PrimeNumFileHead.WriteLine "3" PrimeNumFileHead.WriteLine "5" PrimeNumFileHead.WriteLine "7" PrimeNumFileHead.Close Set PrimeNumFileTail = fs.OpenTextFile(SavePath, ForAppending, TristateFalse) For dCount = 10 To dRange - 10 Step 10 Call TestPrime(dCount + 1) Call TestPrime(dCount + 3) Call TestPrime(dCount + 7) Call TestPrime(dCount + 9) Next PrimeNumFileHead.Close PrimeNumFileTail.Close Set PrimeNumFileHead = Nothing Set PrimeNumFileTail = Nothing Set fs = Nothing End Sub Sub TestPrime(n As Double) sN = CStr(n) dRoot = Sqr(n) Set PrimeNumFileHead = fs.OpenTextFile(SavePath, ForReading, TristateFalse) Do While 1 sEveryLine = PrimeNumFileHead.ReadLine '读取一行 dCurNum = CDbl(sEveryLine) If 0 = (n Mod dCurNum) Then Exit Do If dCurNum > dRoot Then PrimeNumFileTail.WriteLine sN '在文件尾部追加数据 Exit Do End If Loop End Sub
function generatePrime(~) clc iRange=5000; %生成大于2且小于等于iRange的全部质数 SavePath='E:\temp\PrimeNumber.txt'; fpPriNumFile=fopen(SavePath,'w+'); fprintf(fpPriNumFile,'%c\n%c\n%c\n','3','5','7'); for iCount=10:10:iRange-10 TestPrime(iCount+1,fpPriNumFile); TestPrime(iCount+3,fpPriNumFile); TestPrime(iCount+7,fpPriNumFile); TestPrime(iCount+9,fpPriNumFile); end fclose(fpPriNumFile); end function TestPrime(n,fpOpenedFile) fpCopy=fpOpenedFile; cN=int2str(n); dRoot=sqrt(n); frewind(fpOpenedFile); while (~feof(fpOpenedFile)) cEveryLine=fgets(fpOpenedFile); %读取一行 iCurNum=str2double(cEveryLine); if 0==mod(n,iCurNum) break; end if iCurNum>dRoot fseek(fpCopy,0,'eof'); %在文件尾部追加数据 %等价于fseek(fpCopy,0,1); fprintf(fpCopy,'%s\n',cN); break; end end end
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { void TestPrime(unsigned long int n,FILE *fpOpenedFile); unsigned long int iCount,iRange=1000000; //生成大于2且小于iRange的全部质数 char SavePath[100]="E:\\temp\\PrimeNumber.txt"; //注意路径的书写格式喔! FILE *fpPriNumFile; fpPriNumFile=fopen(SavePath,"w+"); fprintf(fpPriNumFile,"%c\n%c\n%c\n",'3','5','7'); for(iCount=10;iCount<iRange;iCount=iCount+10) { TestPrime(iCount+1,fpPriNumFile); TestPrime(iCount+3,fpPriNumFile); TestPrime(iCount+7,fpPriNumFile); TestPrime(iCount+9,fpPriNumFile); } fclose(fpPriNumFile); if(fpPriNumFile!=NULL) free(fpPriNumFile); return(0); } void TestPrime(unsigned long int n,FILE *fpOpenedFile) { FILE *fpCopy; fpCopy=fpOpenedFile; char cN[30],cEveryLine[30]; itoa(n,cN,10); double dRoot; dRoot=sqrt(n); unsigned long int iCurNum; rewind(fpOpenedFile); while (!feof(fpOpenedFile)) { 4000 fgets(cEveryLine,1024,fpOpenedFile); //读取一行 iCurNum=atoi(cEveryLine); if(0==n%iCurNum) break; if(iCurNum>dRoot) {fseek(fpCopy,0L,2); //在文件尾部追加数据 fprintf(fpCopy,"%s\n",cN); break;} } if(fpOpenedFile!=NULL) free(fpOpenedFile); if(fpCopy!=NULL) free(fpCopy); }
相关文章推荐
- 使用Matlab实现对图片的缩放
- matlab 中的删除文件
- Matlab C/C++ 混合编程
- [MATLAB笔记] NN输入格式处理为cell型
- matlab数值积分技巧之将符号表达式转化为函数句柄
- matlab图像陷波滤波以及低通滤波
- C++调用Matlab混合编程
- Matlab 存储图片
- 【matlab】:matlab写的一个QQ九宫格图的程序
- Matlab绘图(一二三维)
- 数字图像处理实验MATLAB版+实验报告亲笔
- caffe的Matlab接口的使用方法
- 二维空间变换 MATLAB帮助翻译
- Matlab中plot函数全功能解析
- KNN分类算法及MATLAB程序与结果
- Matlab中rectangle函数
- matlab采样函数
- Matlab text 命令画螺旋文字
- Matlab中的括号()[]{}
- MATLAB报错"Integers can only be raised to positive integral powers."