Matlab训练2

雄关漫道真如铁,而今迈步从头越。
从头越,
苍山如海,残阳如血。

Matlab官方帮助文档

该文档主要内容:孪生素数与判断素数之间的关系、以及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的相邻素数。
那么假设 n 1 n-1 n + 1 n+1 均为素数----------(1)
\therefore n 1 n-1 n + 1 n+1 均为奇数
\therefore n n 为偶数,即可被2整除----------(2)
再用反证法证明 n n 可被3整除.
假设 n n 不可被3整除
\therefore n = 3 x + 1 n=3x+1 \mid\mid n = 3 x + 2 n=3x+2
\Downarrow
(I)当 n = 3 x + 1 n=3x+1 n 1 = 3 x n-1=3x n + 1 = 3 x + 2 n+1=3x+2 (违背(1))
(II)当 n = 3 x + 2 n=3x+2 n 1 = 3 x + 1 n-1=3x+1 n + 1 = 3 ( x + 1 ) n+1=3(x+1) (违背(1))
\therefore n n 可被3整除----------(3)
(2) (3) 可推得 n n 为6的倍数。且 n n 的左右两侧不一定都是素数。

由上面的规律可以写出以下判断素数的代码

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)
发布了13 篇原创文章 · 获赞 1 · 访问量 448

猜你喜欢

转载自blog.csdn.net/amino_acid0617/article/details/104246599