作业帮 > 综合 > 作业

一道很简单的合数之类的pascal编程问题,就是不知道怎样排除其他的。求大师解答一下

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/05/14 23:43:13
一道很简单的合数之类的pascal编程问题,就是不知道怎样排除其他的。求大师解答一下
输入自然数n,求前n个合数(非素数),其素因子仅有2,3,或5。
【输入样例】
3
【输出样例】
4 6 8
但是这个题目说了它的素因子只有2,3,5,例如输入20
应该输出4 6 8 9 10 12 15 16 18 20 24 25 27 30 32 36 40 45 48 50,其中有一些是没有的,例如14,21......等,怎么办?!
var
m,num:integer; {满足条件的合数个数,计数器}
mm:integer; {计数器--判断有无7以上的因子}
n,nn:integer; { 循环变量,临时变量}
d:array[1..10000] of integer; {存放质数}
k:array[1..10000] of integer; {存放每个质数被整除的次数}
i,j:integer; {循环变量}
z:integer; {质数个数}

function zhisu(n:integer):boolean;
var
j,k:integer;
findd:boolean;
begin
k:=trunc(sqrt(n));
if n=1 then zhisu:=false
else if (n=2)or(n=3) then zhisu:=true
else begin
findd:=false;
j:=1;
repeat
j:=j+1;
if (n mod j)=0 then findd:=true;
until findd or (j>k);
zhisu:=not findd;
end;
end;

begin
readln(m);
num:=0;
for n:=4 to 3000 do begin
nn:=n;
{以下求小于n的质因数并存入数组d中}
z:=0;
for i:=2 to (n div 2) do if zhisu(i) then begin inc(z); d[z]:=i; k[z]:=0; end;
{以下进行质因数分解}
for i:=1 to z do begin
while (nn >=d[i])and(nn mod d[i]=0) do begin
inc(k[i]); nn:=nn div d[i];
end;
end;
{以下判断是否合数,且只有小于等于5的因子}
mm:=0;
for i:=1 to z do if (d[i]>5)and(k[i]>0) then inc(mm);
if (mm=0)and(num