新浪博客

特殊的合数

2012-12-14 08:39阅读:
将合数483的各位数字相加(4+8+3=15,如果将483分解成质因数相乘: 483=3*7*23,把这些质因数各位数字相加(3+7+2+3),其和也为15。即某合数的各位数字之和等于它所有质因数的各数字之和。求500以内具有上述特点的所有合数。
解: ①设n为所要求的合数,让n1500间循环做以下步骤;
②用t1t2分别累计合数n
n的质因数的各位数字之和,初值均为0
③调用过程SUB3进行非素数判定,以布尔变量yes的真假值判定是否,yes的初值为true,如果为 (not true)非素数,就做步骤④,⑤,⑥;否则取新的n值,重复步骤③;
④调用SUB1,求n的各数字之和,传送给t1
⑤调用SUB2,求n的各质因数,对于每个质因素都通过SUB1求它各位数字之和,将所有各质因数字传送给t2
⑥如果t1=t2(各位数字之和等于它所有质因数的各数字之和),则输出此n
参考程序
program exp45;
var n,t1,t2,tatol: integer;
yes: boolean;
procedure sub1(x:integer; var t:integer);

{过程:分离x的各位数字 }
begin {
并求各位数字之和 }
repeat
t:=t+x mod 10;
x:=x div 10;
until x=0
end;

procedure sub2(x: integer; var t: integer); {过程:分解质因数 }
var xx,tt:integer;
begin
xx:=2;
while x>1 do
if x mod xx=0 then

begin
tt:=0;
sub1(xx,tt);
t:=t+tt;
x:=x div xx
end

else inc(xx)
end;

procedure sub3(x: integer;var yy: boolean); {过程:判断x是否为素数 }
var k,m: integer;
begin

k:=trunc(sqrt(x));
for m:=2 to k do
if x mod m=0 then yy:=false;
end;

begin {主程序}
for n:=1 to 500 do
begin
t1:=0;t2:=0;
yes:=true;
sub3(n,yes); {
调用过程是否素数 }
if not yes then {
如果非素数就}
begin
sub1(n,t1); {
调用过程求n的各位数字之和 }
sub2(n,t2); {
调用过程求n的各质因数的数字之和 }
if t1=t2 then write(n:6); {
打印合格的合数 }
end
end;
readln
end.


我的更多文章

下载客户端阅读体验更佳

APP专享