算术练习 1

1、确定给定的整数是否为质数。

质数的定义:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

因数的定义:因数是指整数a除以整数b(b≠0) 的商正好是整数而没有余数,我们就说b是a的因数。

1  is_prime(2).

2  is_prime(3).

3  is_prime(P) :- 

4 integer(P), 

5 P > 3, 

6 P mod 2 =\= 0

7 \+ has_factor(P,3).  

8

9  has_factor(N,L) :- 

10 N mod L =:= 0.

11 has_factor(N,L) :- 

12 L * L < N

13 L2 is L + 2, 

14 has_factor(N,L2).

 

注释行:

1  2是质数

2  3是质数

3  满足下列目标则成功

4  确保P为整数

5  从大于3开始

6  剔除偶数

7  从3开始,如果has_factor失败则成功

8  空行

9  满足下列目标则成功

10 成功则终止(终止条件)

11满足下列目标则成功

12能够被整除的数一定满足这个条件

13 忽略偶数

14 加2后继续递归验证

 

2、确定给定正整数的质数因子。

确定给定正整数的质数因子。

prime_factors(N, L) :- L是N的质数的列表。

 

1  prime_factors(N,L) :- 

2 N > 0

3 prime_factors(N,L,2). 

4

注释行:

1  主谓词 prime_factors/2

2  确保N是大于0的

3  调用谓词prime_factors/3

4  

 

5  prime_factors(N,L,K) :-

6  prime_factors(1,[],_) :- 

7 !. %截断

8  prime_factors(N,[F|L],F) :-  

9 R is N // F

10 N =:= R * F,

11 !, 

12 prime_factors(R,L,F).

13 prime_factors(N,L,F) :-

14 next_factor(N,F,NF), 

15 prime_factors(N,L,NF).

 

注释行:

5  L是N的因子质数的列表。已知N的质数不小于K。

6  1 的质数因子的列表为空列表

7  截断

8  N是F的倍数

9  取后续要处理的数

10 确保上一步是整除

11 截断

12 递归继续处理后续的数

13 N不是F的倍数

14 取处理N不是F的倍数情况的其它数

15 继续递归调用去处理后续的数字

  

next_factor(N,F,NF) :-当计算N的素因数时,如果F不除以N,则NF是要成为N因子的下一个更大的候选者。

 

16 next_factor(_,2,3) :- !.

17 next_factor(N,F,NF) :-

18 F * F < N,

19 !, 

20 NF is F + 2.

21 next_factor(N,_,N).  

 

注释行:

16 如果是最小因子数就终止并且截断

17 找下一个因子数

18 最大因数的必要条件

19 截断

20 F增量2赋给NF后回给查询者

21 当F > sqrt(N)返回N本身

 

例如:

?- prime_factors(315,L).

L = [3, 3, 5, 7].

 

87 ?- prime_factors(1000,L).

L = [2, 2, 2, 5, 5, 5].

 

88 ?- prime_factors(1001,L).

L = [7, 11, 13].

 

3、确定给定正整数的质数因子。构造一组包含质数因子及其重数的列表的列表

Example: 

?- prime_factors_mult(315, L).

L = [[3,2],[5,1],[7,1]]

?- L is 3**2*5**1*7**1.

 

1  :- ensure_loaded(p2_02). 

2

3  prime_factors_mult(N,L) :-

4 N > 0,

5 prime_factors_mult(N,L,2).

6

 

注释行:

1.  确保加载了next_factor/3

2.  空行

3.  L是N的素数的列表。它由项[F,M]组成,其中F是素数,M是多样性。

4.  确保N大于0

5.  调用prime_factors_mult/3

6.  空行

 

7  prime_factors_mult(1,[],_) :- !.

8  prime_factors_mult(N,[[F,M]|L],F) :-

9 divide(N,F,M,R),

10 !,

11 next_factor(R,F,NF), 

12 prime_factors_mult(R,L,NF).

13 prime_factors_mult(N,L,F) :- 

14 !,                         

15 next_factor(N,F,NF), 

16 prime_factors_mult(N,L,NF).

17

 

注释行:

 

7.  1的质数因子列表是空列表

8.  [[F,M]|L]是N的素数的列表。已知N的素数不小于K。

9.  F除以N

10. 截断

11. 获得要取的下一个元素

12. 继续递归处理后续元素

13. F不除N

14. 截断

15. 获得要取的下一个元素

16. 继续递归处理后续元素

17. 空行

 

18 divide(N,F,M,R) :- 

19 divi(N,F,M,R,0),

20 M > 0.

21

 

注释行:

18. N = R * F**M, M >= 1, F不是R的因数

19. 从0开始,到M完成

20. 确保M>0

21. 

 

 

22 divi(N,F,M,R,K) :- 

23 S is N // F,

24 N =:= S * F

25 !,     

26 K1 is K + 1,

27 divi(S,F,M,R,K1).

28 divi(N,_,M,N,M).

 

注释行:

22. F除以N

23. 确保是整除

24. 确保是被整除的

25. 截断

26. K增1后赋值给K1

27. 递归继续处理后续元素

28. 参数1,4相同并且参数3,5相同时终止

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值