您的位置:首页 > 编程语言 > MATLAB

用VBA,MATLAB,C 从小到大生成质数表(源代码)

2016-04-15 15:47 513 查看
代码都是调试通过的。

本算法直接跳过了所有的偶数和个位为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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: