回 帖 发 新 帖 刷新版面

主题:几个问题

在SUB XXX中的XXX能不能是汉字?我试过了不能,那样不太方便。
能不能编一个程序把一个数分解成若干个质数的乘积?(要分解干净!)

回复列表 (共26个回复)

11 楼

就算是吧,把程序写给我看看啊

12 楼

真的要写?
你不后悔?
其实前面都已经有很多旧贴了,老实说.我的确都不太满意
这里以短整形为例做吧,长整形也同样道理的

调用方式:
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 楼

上面的只适用于少量计算的用途,
大量分解质因数计算的话,
其实效率还可以更高的,
这里为了扩展方便,
我就把它定义成长整形了,
还利用了文件,
(一般文件都有会数据存在缓冲区的,所以一般情况下不用担心速度太慢)

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 楼

可以在前面加一些判断质数的语句。

15 楼

moz,既然你理解了我的意思就帮帮忙啊,我做不来啊。难道非要有数组的方式吗?那样我觉得也有可能分解不干净啊。

16 楼

我早已经写好了放13楼那里,本来想叫你趁热吃的,可放了那么久,早就已经凉掉了.

17 楼

[url=http://www.programfan.com/club/showbbs.asp?id=90603&page=last#last]请54BB到这里看看[/url]

18 楼

还有,我想问问你这个54BB是怎么回事?
怎么一会儿大写,一会儿小写的? 你是怎么弄得到的?

19 楼

moz,我说你理解了我的意思就帮我做做啊,随便出一个数。

20 楼

给你指路还不行, 还得把路搬到你面前让你走上去


下面这个函数是写给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

我来回复

您尚未登录,请登录后再回复。点此登录或注册