雄关漫道真如铁,而今迈步从头越。
从头越,
苍山如海,残阳如血。
该文档主要内容:孪生素数与判断素数之间的关系、以及matlab自定义函数如何使用
3-1
clc;clear;
n=input('请输入一个正整数m:');
sum=0;
for i=1:n
if isprime(i)==true
sum=sum+i;
end
end
fprintf('正整数m以内的素数之和sum=%d\n',sum);
3-2
1)不用函数的方法:
clc;clear;
str=input('请输入一个字符串str:');
sum=0;
for i=1:length(str)
if str(i)>='A'&&str(i)<='Z'
sum=sum+1;
end
if str(i)>='a'&&str(i)<='z'
sum=sum+1;
end
end
fprintf('字符串str中的字母的个数sum=%d\n',sum);
2)isletter()函数,自行查询文档了解
(这题以此类推,统计所有数字个数,统计非数字和字母的个数,统计所有大写字母个数。。。)
3-3
clc;clear;
n=input('请输入一个正整数m:');
for i=n:(n*n)
if n==1
fprintf('紧随正整数m的素数为:2\n');
end
if isprime(i)==true
fprintf('紧随正整数m的素数为:%d\n',i);
break;
end
end
3-4
这题就要注意一下坑点,第一个数是表示元素的个数,并不在反序存放的序列之中,把他排开即可。
clc;clear;
n=input('请输入一个数组a:');
n = fliplr(n(2:length(n)))
3-5
clc;clear;
x=input('请输入一个正整数n:');
len=length(num2str(x));
k=mod(x*x,10^len);
if k==x
disp('1');
else
disp('0');
end
3-6
提到孪生素数,有一个有趣的现象:大于5的素数一定出现在6倍数的相邻左侧或右侧,但6倍数的左右两侧不一定就是素数。(自己可以举举例子噢)
证明如下:
我们知道,孪生素数指的是间隔为2的相邻素数。
那么假设
和
均为素数----------(1)
、
均为奇数
为偶数,即可被2整除----------(2)
再用反证法证明
可被3整除.
假设
不可被3整除
(I)当
,
,
(违背(1))
(II)当
,
,
(违背(1))
可被3整除----------(3)
由 (2) (3) 可推得
为6的倍数。且
的左右两侧不一定都是素数。
由上面的规律可以写出以下判断素数的代码
clc;clear;
n=input('请输入一个数n:');
if n<=1
disp('0');
end
if n==2 || n==3
disp('1');
end
if mod(n,6)!=1 && mod(n,6)!=5
%不在6两侧,肯定不是素数
disp('0');
end
%再对6的倍数两侧的数进行判断
for i=5:6:fix(sqrt(n))
if mod(n,i)==0 || mod(n,(i+2))==0
disp('0');
end
end
扯远了,回归3-6,理解题意后,这题就变的简单易懂了
clc;clear;
n = input('请输入一个数字n:');
for i=1:n
if isprime(i-1)==1 && isprime(i+1)==1
fprintf('%d ',i);
end
end
T_1
clc;clear;
n = input('请输入一个数字n:');
disp('请输入n个[10,60]上的整数');
a = input('');
j=1;
for i=1:n
if mod(a(i),5)==0
b(j)=a(i);
j=j+1;
end
end
if j-1==0
disp('0');
else
fprintf('n个数中能被5整除的最大的数为:%d\n',max(b));
end
T-2 与2-12相似,跳过。
T-3
clc;clear;
lim = input('请输入一个数字lim:');
j=1;
for i=2:lim
if isprime(i)==1
aa(j)=i;
j=j+1;
end
end
disp('小于lim的素数如下:');
for i=1:j-1
fprintf('%d ',aa(i));
end
fprintf('\n共%d个\n ',j-1);
T-4
此题的关键在于把一串数字中的每一位都取出来。
利用矩阵的转置,就可以很方便的做到,此外,这个题可以利用自定义函数来进行输出。
matlab的自定义函数用function定义,定义模板为
function 函数返回值=函数名(若干个输入参数)
中间是自定义函数主体
end
在这个题中,mod7为当前函数的返回值,返回值为0/1,m为参数,函数名为sum_mod。需要注意的是,自定义函数需要保存为.m文件,且文件名要与函数名一致。对于当前代码来说,文件名在保存时应该命名为sum_mod.m文件
function mod7 = sum_mod(m)
%自定义了一个判断数位之和能否被7整除的函数
sum=0;
m=str2num(num2str(m)')';
for i=1:length(m)
sum=sum+m(i);
end
if mod(sum,7)==0
mod7 = 1;
else
mod7 = 0;
end
end
%调用自定义函数进行判断并且输出,i即为函数参数中的m
clc;clear;
disp('100~200之间各位数字之和能被7整除的数如下所示:')
for i=100:200
%判断sum_mod(i)是否等于一,即判断自定义函数中的mod7是否为1
if sum_mod(i)==1
fprintf('%d ',i);
end
end
T-5
clc;clear;
sum = 0;
for i=1:100
sum = sum+1/i;
end
sum
T-6
如果不会或者不熟练,回顾阶乘的求法
clc;clear;
sum = 0;
for i=21:-3:3
mul=1;
for j=1:i
mul=mul*j;
end
sum = sum+mul;
end
sum
T-7
如果想展现与描述一模一样的杨辉三角,那么需要算一行就打印一行,不然如果是一个二维数组来存,最后打印时上三角全为0.
clc;clear;
n=1;
disp(n);
for i=2:10
n=[n,0]+[0,n];
n(i)=1;
disp(n);
end
T-8类似与T-5,略过。
T-9
了解转置操作为“ ‘ ”符号;
clc;clear;
a=input('请输入一个3*3的矩阵:');
b=a'
T-10
提取主对角线元素后进行点乘,然后用sum求和即可。
clc;clear;
a=input('请输入一个n*n的矩阵:');
s=sum(diag(a).*diag(a))
T-11
注意一下对角线想交的元素只加一次即可。提取主对角线的函数:diag,在求副对角线时把矩阵进行左右翻转即可(fliplr)
clc;clear;
a=input('请输入一个5*5的矩阵:');
s=sum(diag(a))+sum(diag(fliplr(a)))-a(3,3)
T-12
类似于3-2
clc;clear;
str=input('请输入一个字符串str:');
letter=0;num=0;space=0;other=0;
for i=1:length(str)
if str(i)>='A'&&str(i)<='Z'
letter=letter+1;
elseif str(i)>='a'&&str(i)<='z'
letter=letter+1;
elseif str(i)>='0'&&str(i)<='9'
num=num+1;
elseif str(i)==' '
space=space+1;
else
other=other+1;
end
end
fprintf('字符串str中的字母的个数letter=%d\n',letter);
fprintf('字符串str中的数字的个数num=%d\n',num);
fprintf('字符串str中的空格的个数space=%d\n',space);
fprintf('字符串str中的其他字符的个数other=%d\n',other);
T-13
查询max函数用法。
clc;clear;
a=input('输入一个二维矩阵')
b=max(a)