数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
楼主: 白新岭

[原创]请教vfbpgyfk先生一个编程问题

  [复制链接]
 楼主| 发表于 2019-2-28 16:37 | 显示全部楼层
clear
N=0
T=0
FOR X=1 TO 10000
  S=0
  FOR I=1 TO X/2
       IF X%I=0
        S=S+I
       ENDIF
    NEXT
    IF S=X
     N=N+1
     T=T+X
     ?X
     ENDIF
  NEXT
   ?"个数:",N,"和:",T
   RETURN
这是求10000以内的完数程序
 楼主| 发表于 2019-2-28 17:42 | 显示全部楼层
CLEAR
N=0
FOR A=1 TO 49
   FOR B=1 TO A-1
      FOR C=1 TO B-1
        IF A+B+C<50 AND 1/A^2+1/B^2=1/C^2
        N=N+1
        ?A,B,C
        ENDIF
      NEXT
    NEXT
  NEXT
  ?N
  RETURN
这是求a>b>c,a+b+c<50,且1/a^2+1/b^2=1/c^2的组数

实际上根据所给条件,a可以从3取值到46,b从2取值即可。
 楼主| 发表于 2019-2-28 17:56 | 显示全部楼层
1,求1到2000之间,能被3或7整除,并且含有数字5的个数,它们的和,平方根和(保留两位小数),以及他们的平方和。
2,求能被3整除,且至少含有一个5的三位数个数
3,求出只能被2,7,9之一整除的正整数,在800以内。
4,求[105,625]之间同时能被7和11整除的自然数之和,求[200,600]之间的奇数之和。
5,求1000到2000同时满足除3余2,除5余3两个条件的自然数个数
6,输出10至100除以17的余数与除以5的商相等的个数
7,求1000至9999之间能被3整除,且千位数字与个数数字之和为8的个数
8,求所有4位数的奇数中各位数字之和是25倍数的数字之和
9,求出所有能被17整除,且不含重复数字的3位数的和
10,求1至500中偶数立方和与奇数立方和之差
11,求3,9,27,81,243,这样的数和,如果累加和大于500则停止累加。
12,计算1*5*9*13*....*K,直到k>=25为止
13,求1,3,5,7,.....,这样的奇数之和,当累计和大于500时结束
14,求出1到5000之内能被5整除,若干个偶数之和,当和大于等于500时程序退出
15,编写程序s=1+1/2+1/3+1/4+.......+1/99,保留两位小数
16,编程求1*3+2*4+3*5+6*8+......+198*200
17,编程求s=1+1/2+1/3+1/4+.......+1/N,s不超10的n
18,求s=8!+9!+10!
19,编程求10!
20,求s=3!+5!+7!+......+N!,直到s>=680000为止,求奇数n
21,s=1!+2!+3!+....+N!,当s大于61000时结束累加,求n
22,数列xi为x1=1,x2=1+2,x3=1+2+3,.....xn=1+2+3+....+n,  s=x1+x2+x3+....+xn,求当s>3000时,数列的最大值xn
23,s1=1,s2=1+2,s3=1+2+3,......,sn=1+2+3+.....+n,求s20到s80间有多少个能被17或35整除的sn
24,求1到10任意两个数的和能被2整除的数对(注意4+5与5+4这样的算一对)
25,数列A(1)=1,A(2)=2,A(3)=3,以后项每项都是前三项的和,求A(15)  (从编程看角码可以为变量
26,编写程序求200至800间的素数个数
27,编写程序求600至900间的素数和
28,编程求100至900间内被3整除的回文数的和
29,编写程序,计算10到50间有多少个数,它们各位数字和小于各位数字积
30,把18元钱分成1元,2元,5元纸币,纸币数为10,共有多少种分法(在兑换中,可以为0张)
31,编写程序,看一看在i,j,k中符合条件的有几组,ijk+kji=1333,i,j,k是一位数0至9之间。
32,一个数如果与它的因子和相等(本身除外),则为完数,求10000内的完数
33,已知a>b>c,且a+b+c<50,求1/a^2+1/b^2=1/c^2共有多少组
到今天为止,已经把豆丁网上的“vfp程序设计题(附参考答案)”中的练习题做完了。

用到了for  to

  next(endfor)语句

do  while

exit

enddo语句

if

endif语句

和取整函数int(),求余数(模函数)mod( ,)或%,平方根sqrt()等等

所以要想熟悉并灵活运用就得练习,熟能生巧。
 楼主| 发表于 2019-2-28 20:49 | 显示全部楼层
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\万内素数表.dbf ALIAS 万素 &&给万内素数表用个别名代替
FOR H=3 TO 9999 step 2 &&从奇数3开始到奇数9999结束
        FOR J=2  to  sqrt(H) &&从素数2开始到平方根前
                IF H%J=0
                EXIT
                ENDIF
        NEXT
           IF J>SQRT(H)
           SELECT  万素 &&选择工作区
           APPEND BLANK  &&增加一条记录
           REPLACE 素数 WITH H &&把H值付给变量素数
           ENDIF
NEXT
                               
这是编程求的万内素数
 楼主| 发表于 2019-2-28 21:48 | 显示全部楼层
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\万内素数表.DBF ALIAS 万素
SELECT 2
USE E:\用vfp求k生素数数量\S3165万内素数.DBF ALIAS S3165万素
        For N=3 to 9999 step 2
        Kf=INT(SQRT(N))       &&求出奇数的开方根
        SELECT  万素             &&打开素数表
        LOCATE FOR 素数>=kf      &&根据开方根,查找最大素数
        DO CASE
                CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
        ENDCASE
        SSS=RECNO()    &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 1           &&从第一条记录开始读取素数(3)
        FOR j=1 TO SSS       &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(N,素数)   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0
                        EXIT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
        ENDFOR
        IF j>sss
                SELECT  S3165万素       &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 素数 WITH N             &&将N值付给素数
        ENDIF
        ENDFOR
CLEAR ALL
这是用素数表制造素数的程序,把素数3给丢了(素数2不会产生)
 楼主| 发表于 2019-3-1 12:32 | 显示全部楼层
clear
SELECT 1
USE "C:\Visual Foxpro 项目\素数生成元.DBF" ALIAS 素数元
      kssj=SECONDS()                      &&取出开始时间
      FOR N=1  TO  510509 STEP 2
             @ 2,5 say N   &&显示N值
             IF N%3=0 OR N%5=0 OR N%7=0 OR N%11=0 OR N%13=0 OR N%17=0
              ELSE
                SELECT  素数元       &&打开盛放素数的表
                APPEND BLANK         &&增加一条空记录
                REPLACE 素数式 WITH N     &&将N值付给素数式
            ENDif
     
      ENDFOR
      =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
SELECT 素数元
这是用vfp程序生成的素数式(不能被2,3,5,7,11,13,17整除的,循环周期为510510),用时1分10.28秒,判断了255255个奇数,获得了92160个素数式(素数出现位置)
 楼主| 发表于 2019-3-1 12:44 | 显示全部楼层
不知道程序的运算时间是如何计算的,在上面产生生成元的数量是92160个,即在510510周期内只能有92160个自然数有可能是素数,这比起奇数的个数255255要少的多,但是运算时间会不会与它成正比关系,我想不会,因为即便是用奇数参与筛选,在条件函数中也有出口(退出循环的语句),它的用时应该很少,大部分时间是话费在素数本身上,因为它只有运行完所有根号前素数,才判断成素数,内循环一步都不少。
 楼主| 发表于 2019-3-1 16:08 | 显示全部楼层
CLEAR ALL
SELECT 1
USE c:\visualfoxpro项目\素数表万.DBF ALIAS 万素
SELECT 2
USE c:\visualfoxpro项目\素数生成元.DBF ALIAS 生成元
SELECT 3
USE c:\visualfoxpro项目\素数62个周期.DBF ALIAS 素数62周
    kssj=SECONDS()                      &&取出开始时间
   For n=0 to 1
        SELECT 生成元
        DO WHILE NOT EOF()
            bpz=素数式+N*510510
            Kf=INT(SQRT(bpz))       &&求出奇数的开方根
            SELECT  万素             &&打开素数表
            LOCATE FOR 素数万>=kf      &&根据开方根,查找最大素数
            DO CASE
                CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数万>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
            ENDCASE
            SSS=RECNO()    &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
            GO 1           &&从第一条记录开始读取素数(3)
            FOR j=1 TO SSS       &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数万)   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0
                        EXIT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
            ENDFOR
            IF j>sss
                SELECT  素数62周       &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 素数 WITH bpz            &&将N值付给素数
          ENDIF
         SELECT  生成元
        skip
       ENDdo
   endfor
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
CLEAR ALL
用时10分36.02秒,不知问什么没有执行最外层的循环,还是赋值出错了?
 楼主| 发表于 2019-3-2 22:37 | 显示全部楼层
上楼的问题已经解决了,问题出在选择工作区后,没有语句把指针从表尾移到表头,即需要加go 1语句,在select 生成元 语句之后,执行一次外循环,当再次执行时一定把指针复原。
 楼主| 发表于 2019-3-2 22:40 | 显示全部楼层
本帖最后由 白新岭 于 2019-3-3 03:04 编辑

执行了3次外循环用时53分6.93秒,2019年3月3日运行外循环for N=4 to 6 用时72分2.39秒
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2025-5-13 09:44 , Processed in 0.094815 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表