主题:几个问题
54BB
[专家分:380] 发布于 2005-07-04 17:00:00
在SUB XXX中的XXX能不能是汉字?我试过了不能,那样不太方便。
能不能编一个程序把一个数分解成若干个质数的乘积?(要分解干净!)
回复列表 (共26个回复)
11 楼
54BB [专家分:380] 发布于 2005-07-14 18:21:00
就算是吧,把程序写给我看看啊
12 楼
moz [专家分:37620] 发布于 2005-07-14 21:44:00
真的要写?
你不后悔?
其实前面都已经有很多旧贴了,老实说.我的确都不太满意
这里以短整形为例做吧,长整形也同样道理的
调用方式:
n=20160
print n;"这个数分解成质因数如下:"
do while n>1
a=fjjys(n)
if a>1 then print a;
if n>1 then print "*";
loop
defint a-z
function fjjys(x)
if x<2 then
fjjys=1
exit function
end if
i=2
do until (x mod i =0)
do
i=i+1
loop until js(i)
loop
x=x/i
fjjys=i
end function
defint a-z
function js(a)
if a<2 then exit function
q=int(sqr(a))
for i=2 to q
if a mod i =0 then exit for
next
if i>q then js=-1
end function
13 楼
moz [专家分:37620] 发布于 2005-07-15 00:14:00
上面的只适用于少量计算的用途,
大量分解质因数计算的话,
其实效率还可以更高的,
这里为了扩展方便,
我就把它定义成长整形了,
还利用了文件,
(一般文件都有会数据存在缓冲区的,所以一般情况下不用担心速度太慢)
DEFLNG I
CLS
i = 9745897
DO WHILE i > 1
PRINT fenjie(i); "*";
LOOP
DEFLNG A-H, J-Z
FUNCTION fenjie (x)
STATIC s, i
IF x < 2 THEN EXIT FUNCTION
IF s <> x THEN i = 2
DO UNTIL (x MOD i = 0)
i = nextjs(i)
LOOP
x = x / i
s = x
fenjie = i
END FUNCTION
FUNCTION nextjs (a)
STATIC f
IF f = 0 THEN
f = FREEFILE
OPEN "质数表" FOR RANDOM AS #f LEN = LEN(f)
IF LOF(f) = 0 THEN
z = 2
PUT #f, 1, z
z = 3
PUT #f, 2, z
END IF
END IF
e = LOF(f) \ LEN(f)
GET #f, e, z
SELECT CASE a
CASE IS < 2
nextjs = 2
CASE IS >= z
DO UNTIL z > a
DO
z = z + 1
q = INT(SQR(z))
FOR i = 2 TO q
IF z MOD i = 0 THEN EXIT FOR
i = nextjs(i) - 1
NEXT
LOOP UNTIL i > q
e = e + 1
PUT #f, e, z
LOOP
nextjs = z
CASE IS < z
l = 1
r = e
DO
m = (r + l) / 2
GET #f, m, b
IF a < b THEN r = m ELSE l = m
LOOP UNTIL r - l < 2
GET #f, r, nextjs
END SELECT
END FUNCTION
呵呵,我一不小心把数字弄错了
弄了这么一个数9745897出来
搞到我的质数表搞了不知多少万质数来了
你只要运行一次也就可以得到一个大大的质数表了
以后就不用愁质数计算了,哈哈
有了质数表
以后关于质数的计算和判断保你高效十倍百倍不止了
我对这一篇东西很满意
破例第一次加精,(还是自已加精,狂汗,太自大了)
14 楼
163111511 [专家分:90] 发布于 2005-07-17 20:14:00
可以在前面加一些判断质数的语句。
15 楼
54BB [专家分:380] 发布于 2005-07-27 14:21:00
moz,既然你理解了我的意思就帮帮忙啊,我做不来啊。难道非要有数组的方式吗?那样我觉得也有可能分解不干净啊。
16 楼
moz [专家分:37620] 发布于 2005-07-27 16:04:00
我早已经写好了放13楼那里,本来想叫你趁热吃的,可放了那么久,早就已经凉掉了.
17 楼
moz [专家分:37620] 发布于 2005-07-27 22:44:00
[url=http://www.programfan.com/club/showbbs.asp?id=90603&page=last#last]请54BB到这里看看[/url]
18 楼
moz [专家分:37620] 发布于 2005-07-27 22:52:00
还有,我想问问你这个54BB是怎么回事?
怎么一会儿大写,一会儿小写的? 你是怎么弄得到的?
19 楼
54BB [专家分:380] 发布于 2005-08-06 11:34:00
moz,我说你理解了我的意思就帮我做做啊,随便出一个数。
20 楼
moz [专家分:37620] 发布于 2005-08-06 12:01:00
给你指路还不行, 还得把路搬到你面前让你走上去
下面这个函数是写给54BB的分解质因数的,希望他能看到并且能用得着
do
input a&
print Fenjie$(a&)
loop while a&
FUNCTION IsZhiShu& (a&)
f% = FREEFILE
OPEN "质数表" FOR RANDOM AS #f% LEN = LEN(a&)
IF LOF(f%) = 0 THEN
z& = 2
PUT #f%, 1, z&
z& = 3
PUT #f%, 2, z&
END IF
e& = LOF(f%) \ LEN(a&)
GET #f%, e&, z&
SELECT CASE a&
CASE IS <= 2
IsZhiShu& = 2
CASE IS >= z&
DO UNTIL z& >= a&
DO
z& = z& + 2
q& = SQR(z&)
i& = 2
DO
GET #f%, i&, k&
IF z& MOD k& = 0 THEN EXIT DO
i& = i& + 1
LOOP UNTIL k& > q&
LOOP UNTIL k& > q&
e& = e& + 1
PUT #f%, e&, z&
LOOP
IsZhiShu& = z&
CASE IS < z&
l& = 1
r& = e&
DO
m& = (r& + l&) / 2
GET #f%, m&, b&
IF a& > b& THEN l& = m& ELSE r& = m&
LOOP UNTIL r& - l& < 2
GET #f%, r&, IsZhiShu&
END SELECT
CLOSE #f%
END FUNCTION
FUNCTION fenjie$ (x&)
if x&=0 then
fenjie$="0"
exit function
elseif x&<0 then
x&=-x&
k$="-1"
end if
f% = FREEFILE
OPEN "质数表" FOR RANDOM AS #f% LEN = LEN(a&)
i& = 1
j& = 2
DO UNTIL x& = 1
IF x& MOD j& = 0 THEN
x& = x& / j&
IF k$ = "" THEN k$ = LTRIM$(STR$(j&)) ELSE k$ = k$ + "*" + LTRIM$(STR$(j&))
ELSE
i& = i& + 1
if eof(f%) then j&=IsZhiShu& (j&+1) else GET #f%, i&, j&
END IF
LOOP
CLOSE #f%
fenjie$ = k$
END FUNCTION
我来回复