讨论 / 郁闷,交了2次才过,贴出程序!
vinence 2012-07-28 20:29:00
点我顶贴 收藏 删除

第一次交的程序,

最后一个点超时.

--------------------------------------------------

var

n:int64;

function pd(a:int64):boolean;

var

j:longint;

begin

pd:=true;

for j:=2 to trunc(sqrt(a)) do

if a mod j = 0 then

begin

pd:=false;

exit;

end;

end;

procedure try;

var

i:longint;

begin

for i:=2 to n do

if n mod i = 0 then

if pd(i) then

begin

write(i, );

n:=n div i;

exit;

end;

end;

begin

readln(n);

repeat

if pd(n) then

begin

write(n);

halt;

end;

try;

until false;

end.

==================================================

然后很郁闷,

换了方法,

先生成1-trunc(sqrt(n))范围内的所有素数,

结果过了.

--------------------------------------------------

var

n:int64;

i,ls,s:longint;

a:array[1..10000] of longint;

function pd(p:longint):boolean;

var

j:longint;

begin

pd:=true;

for j:=2 to trunc(sqrt(p)) do

if p mod j = 0 then

begin

pd:=false;

break;

end;

end;

begin

readln(n);

for i:=2 to trunc(sqrt(n)) do

if pd(i) then

begin

inc(ls);

a[ls]:=i;

end;

s:=1;

repeat

while n mod a[s] = 0 do

begin

write(a[s], );

n:=n div a[s];

end;

inc(s);

until (n mod a[s-1]=n) or (s>ls) ;

if n<>1 then write(n);

end.

--------------------------------------------------

状态题目:大合数分解

状态编号: [查看该题]

状态: Accepted

测评机: Xeost[5]

得分: 100分

提交日期: 2008-7-27 23:04:00

有效耗时: 该状态没有记录

测试结果1: 测试结果正确

测试结果2: 测试结果正确

测试结果3: 测试结果正确

测试结果4: 测试结果正确

测试结果5: 测试结果正确

测试结果6: 测试结果正确

测试结果7: 测试结果正确

测试结果8: 测试结果正确

测试结果9: 测试结果正确

测试结果10: 测试结果正确

==================================================

再次攻克一道水题,继续努力.

#1 wish@2008-07-27 18:25:00
回复 删除
私以为不需要筛吧。。。

program p114(input, output);

var

i, j: longint;

q: int64;

wr: boolean;

begin

readln(q);

wr := false;

for i := 2 to trunc(sqrt(q)) + 1 do

while q mod i = 0 do

begin

q := q div i;

if wr then

write( , i)

else

begin

write(i);

wr := true

end;

if q = 1 then

begin

writeln;

halt

end

end;

if q <> 1 then

if wr then

writeln( , q)

else

writeln(q)

else

writeln;

readln

end.

#2 zjlsykw3636@2008-07-28 05:42:00
回复 删除
....楼上几位的程序实在是XXX

var

n:qword;

a:longint;

begin

readln(n);

a:=1;

while n<>1 do

begin

inc(a);

while (n mod a)<>0 do

inc(a);

n:=n div a;

write(a, );

a:=1;

end;

end.

AC~

#3 419488575@2008-07-29 06:28:00
回复 删除
其实这样也可以的:

program exale;

var n:longint;

m:qword;

begin

readln(m);

n:=1;

while m<>1 do

begin

inc(n);

while m mod n<>0 do

inc(n);

while m mod n=0 do

begin

m:=m div n;

write(n, );

end;

end;

end.

#4 我不是白痴@2010-09-23 19:32:00
回复 删除
不优化可以吗

#5 我不是白痴@2010-09-23 19:33:00
回复 删除
关于LS的问题

#6 woshiyaoxin@2011-08-02 05:03:00
回复 删除
我觉得,不用筛,直接用这个数除之前求出的素数就行了

晒代码

var n,i,j,k,l,t:longint;

ss:boolean;

a:array[1..1000000] of longint;

begin

a[1]:=2;

readln(n);

t:=1;

while n>1 do

begin

while n mod a[t]=0 do

begin

write(a[t],' ');

n:=n div a[t];

end;

inc(t);

l:=a[t-1];

inc(l);

repeat

ss:=false;

for i:=1 to t-1 do if l mod a[i]=0 then

begin ss:=true; inc(l);break;end;

until not(ss);

a[t]:=l;

end;

end.

#7 abcd1999@2012-07-28 20:29:00
回复 删除
var n:int64;

i:longint;

begin

read(n);

i:=2;

repeat

while n mod i=0 do begin n:=n div i; write(i,' '); end;

inc(i);

until n=1;

end.

查看更多回复
提交回复