MATLAB求完全数、梅森数、质数、奇数、偶数、回文数、水仙花数、亲密数、合数的质因子分解
实验1 :奇数
奇数即按2分类出的两种类型数字中被2整除余1的数字,偶数即被2整除等于0的数字。
程序
num=input('请输入一个自然数:');
if mod(num,2)== 0
fprintf(' %d 是偶数。\n', num);
else
fprintf(' %d 是奇数。\n', num);
end
实验二:水仙花数
水仙花数是指一个 3 位数,它的每个位上的数字的立方和等于它本身(例如:13+53+3^3=153。我们写出如下程序判断某个数是不是水仙花数,同时举出反例验证程序的准确性。
程序
num=input('请输入一个三位自然数:');
bai = floor(num/100); % 百位
shi = floor(mod(num,100)/10); % 十位
ge = floor(mod(num,10));
a= bai.^3+shi.^3+ge.^3;
if num == a
fprintf(' %d 是水仙花数。\n', num);
else
fprintf(' %d 不是水仙花数。\n', num);
end
实验三:完全数
若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数,又称完美数或完备数,是一些特殊的自然数:它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身.
研究完全数的意义:首先可以进深一步研究数学和运用数学理论;然后探索数学奥秘,找出相应规律,应用于社会实际;再者在研究完全数的过程中可以提出新的概念,为软件开发起到引导作用等等。基于以上意义写出两个程序,第一个是找出n以内的完全数,n可修改。第二个程序是为了得到一个数是否为完美数的结果。
程序1
num=input('请输入一个自然数:');
wq = [];
for i = 2:num
sum = 0;
k = 1;
for j = 2: i / 2
if mod(i,j) == 0
sum = sum + j;
end
end
if sum + 1 == i
wq=[wq i];
end
end
disp(['完全数有: ',num2str(wq)])
程序2
num=input('请输入一个自然数:');
sum = 0;
k = 1;
for i= 2: num / 2
if mod(num,i) == 0
sum = sum + i;
end
end
if sum + 1 == num
fprintf(' %d 是完全数。\n',num);
else
fprintf(' %d 不是完全数。\n', num);
end
实验四亲密数
如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。
根据问题描述,该问题可以转化为:给定整数A,判断A是否有亲密数。为解决该问题,首先定义变量a,并为其赋初值为某个整数。则按照亲密数定义,要判断a中存放的整数是否有亲密数,只要计算出该整数的全部因子的累加和,并将该累加和存放到另一个变量b中,此时b中存放的也是一个整数。再计算b中存放整数的全部因子的累加和,将该累加和存放到变量n中。最后若n等于a则可判定变量a和b中所存放的整数是亲密数。
程序
a=input('请输入一个自然数:');
b=0;i=1;n=0;
while(i<a)
if mod(a,i)==0
b=b+i;
end
i=i+1;
end
i=1;
while(i<b)
if mod(b,i)==0
n=n+i;
end
i=i+1;
end
if n==a&a<b
fprintf("%d %d为一对亲密数", a, b);
else
fprintf(' %d 没有对应的亲密数。\n', a);
end
实验五 回文数
设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。根据实际情况,本次只考虑验证四位数的回文数,其余回文数皆可类似展开。*
程序
num=input('请输入一个四位自然数:');
qian= floor(num/1000);
bai=floor(mod(num/100,10));
shi=floor(mod(num/10,10));
ge=floor(mod(num,10));
if qian==ge&bai==shi
fprintf(' %d 是回文数。\n',num);
else
fprintf(' %d 不是回文数。\n', num);
end
实验六 对于求合数的质因子分解
程序
num=input('请输入一个自然数:');
i = 3;
fprintf('%d=', num);
while(mod(num,2) == 0)
fprintf(' %d', 2);
num=num/2;
if (num==1)
fprintf(' ');
else
fprintf('*');
end
end
while(i <=num )
if (mod(num,i)== 0)
fprintf(' %d', i);
num=num/i;
if (num==1)
fprintf(' ');
else
fprintf('*');
end
else
i=i+2;
end
end
实验七:素数判断n以内的素数,n可以修改。
程序
y = [2];
for num= 3:2:100
n = fix(sqrt(num))+1;
for k = 2:n
if mod(num ,k)==0
break;
end
end
if k==n
y = cat(1 , y , num);
end
end
实验八:梅森数
梅森数(Mersenne number)又称麦森数,是指形如2^p-1的正整数,其中指数p是素数,常记为Mp 。探寻梅森素数是发现已知最大素数的最有效的途程序径,自欧拉证明M31为当时最大的素数以来,在发现已知最大素数的世界性竞争中,梅森素数几乎囊括了全部冠军。梅森素数在实用领域也有用武之地。现在人们已经将大素数用于现代密码设计领域,其原理是:将一个很大的数分解成若干素数的乘积非常困难,但将几个素数相乘却相对容易得多。在这种密码设计中,需要使用较大的素数,素数越大,密码被破译的可能性就越小。 探寻梅森素数最新的意义是,它促进了分布式计算技术的发展。若其是素数,则称为梅森素数。在此我们对梅森数的基本性质进行判定,考虑现实因素并不进行过于繁重的运算,仅仅对p=19以内的梅森数进行判定。
程序
j=2;i=2;
while(i<20)
m=2^i-1;
while(j<=sqrt(m))
if mod(m,j)==0
break;
end
j=j+1;
end
if j>sqrt(m)
fprintf('P=%d时,2^P=%d是梅森数。\n',i,m);
end
i=i+1;
end
注意事项
如有错误,欢迎指出