路漫漫其修远兮,吾将上下而求索
Matlab官方帮助文档
1-1、1-2 进制转换
首先,matlab具有进制转化函数dec2bin(十进制转二进制),bin2dec(二进制转十进制),dec2base…但是注意:在使用上述函数的时候,只能实现非负整数与二进制数之间的转化,如果使用负整数的时候会出现错误。
1)十进制转其他进制
十进制整数进行N进制转换时,我们采用短除法,即“除N取余,逆序排列”法。具体是把十进制数,除以N,得到商和余数,保留余数继续除N,直到商为0,将余数倒过来排列即可。
小数则是“乘N取整,顺序排列”法。具体是把十进制数乘N后取整,保留整数部分后小数部分继续乘N,直到积中小数部分为0或者符合要求的精度(因为十进制小数转化为其他进制时可能会出现无限位的小数),将取出的整数部分按照取出的顺序排列即可。
2)其他进制转10进制
一般方法:逢N进1, 按照从低位到高位的权值来进行计算,第0位的权值就是N的0次方…依次递增下去,最后把结果进行相加即可。
1-1
clc;clear;
decNum=input('请输入一个10进制数:');
binNum=0;n=decNum;
i=1;remainder=0;
while n~=0
remainder=mod(n,2);
n=fix(n/2); %注意这里的取整函数
binNum=binNum+remainder*i;
i=i*10;
end
fprintf("十进制数%d转换为二进制为%d\n",decNum,binNum);
1-2
clc;clear;
binNum=input('请输入一个2进制数:');
decNum=0;n=binNum;
i=0;remainder=0;
while n~=0
remainder=mod(n,10);
n=fix(n/10); %注意这里的取整函数
decNum=decNum+remainder*power(2,i);
i=i+1;
end
fprintf("二进制数%d转换为十进制为%d\n",binNum,decNum);
1-3 思路:利用num2str进行转化,将八位数化为一维字符串数组后直接进行比较
即可。(理清减数与被减数的关系,注意最高位无论如何都是置一的)
clc;clear;
n=input('请输入第一个8位数n:');
m=input('请输入第二个8位数m:');
n=num2str(n);
m=num2str(m);
s=[1];
for i=2:8
%字符串元素直接进行比较(通过比较ASCII码值的大小)
if n(i)>=m(i)
s(i)=1;
else
s(i)=0;
end
end
s
1-4 思路:边沿数值=矩阵最上面一行+矩阵底部一行+其他,其他的元素均为每一行的首元素或尾元素计算即可。
clc;clear;
n=input('请输入矩阵的行数n:');
m=input('请输入矩阵的列数m:');
array=input('请输入n行m列的矩阵,用[]括起来:');
s=sum(array(1,:))+sum(array(n,:)); %为避免与sum函数冲突,使用s为变量名,计算矩阵顶行与底行
for i=2:n-1
s=s+array(i,1)+array(i,m);
end
fprintf("该矩阵的边缘数值和为:%d\n",s);
1-5 思路:直接相加,利用矩阵的基本运算组合
clc;clear;
n=input('请输入矩阵的行数与列数n:');
array=input('请输入n行n列的矩阵,用[]括起来:');
s=sum(sum(array(:,1:2:n)));
fprintf("该矩阵的奇数列和为:%d\n",s);
1-6、1-7均与因子有关
先列出求因子的模板。
%求n的所有因子
a=1:n;
factor=find(mod(n,a)==0);
原理:一个数的因子即能整除n的数利用mod函数加判断,然后巧用find函数
1-6
clc;clear;
j=1;
for i=1:100
a=1:i;
factor=find(mod(i,a)==0);
%算和的时候除去本身
if sum(factor)-i==i
pfNum(j)=i;
j=j+1;
end
end
disp('100以内的完全数(perfect number)有:');
pfNum
1-7与1-6的区别不大
clc;clear;
j=1;
for i=1:100
a=1:i;
factor=find(mod(i,a)==0);
if sum(factor)-i>i
abNum(j)=i;
j=j+1;
end
end
disp('100以内的盈数(abundant number)有:');
abNum
1-8
看大家交上来的1-8,或多或少都不是那么完美。这个题目的1-8有两个要求,要求一: 找到和为1000的连续正整数序列。要求二: 输出对应整数列的中整数的个数。
思路:题目意思比较好懂,普通方法就是三层循环暴力破解,第一重控制这个序列的起点,第二重控制序列元素的个数,第三重输出符合题意的序列。但是这样耗费的时间比较长,假设我们要求的是和为n的连续正整数序列,那么最多可能要耗费
次遍历循环。但是经过改进后,循环最多循环
次遍历循环,时间是不是减少了很多!!!
改进方法: 观察题目,题目说的是连续的序列,所以可以考虑等差数列的性质。等差数列的求和方式有两种,一是 知道首项,尾项和公差,二是 知道首项/尾项,个数和公差。从题目来看,我们选择第二种方法更为合适。设序列起点为a,共有n个整数,则和
将上面的公式稍加变形,得到
由于a为正整数,所以一定有
%
。因此我们可以考虑用控制个数n的方式直接求出符合题意的序列起点a,然后输出。
clc,clear;
n=1000;
for i=2:fix(sqrt(2*n+1))
a=2*n/i+1-i;
if mod(a,2)==0
fprintf('1000=');
for j=a/2:a/2+i-1
if j==i+a/2-1
fprintf('%d 共有%d个整数\n',j,i);
else
fprintf('%d+',j);
end
end
end
end
一个有趣的现象:什么样的数可以写成连续的n个自然数之和,什么样的不能呢?运行上面的代码,改变n的值,我们发现除了
以外,其余所有数都可以写成该形式。
证明如下:
如果数s符合条件,由一开始的推导我们知道
,由于2s一定为偶数,那么
和n肯定不可能都为奇数。那么是否有可能两个都是偶数呢?我们假设n为偶数,那么
一定为偶数,即
为奇数。如果假设n为奇数,那么可以得到
一定为偶数。总结起来就是,s一定会有一个奇数因子,而
是一定不含奇数因子的。
1-9
记住
为连乘符号后这个题就很简单,连乘matlab的函数为prod,用法和sum求和函数类似
clc;clear;
n=input('请输入一个数n:');
mul=1;
for i=1:n
mul=mul*(1+1/i);
end
mul
1-10
先阶乘后累加,阶乘可用函数factorial
clc;clear;
n=input('请输入一个整数n:');
s=0;
for i=1:n
s=s+factorial(i)/(2*i+1);
end
s
1-11 求解n次多项式方程的解:root函数
(用solve也可以,但是root更好)
clc;clear;
a=[3 4 7 2 9 12];
x=roots(a)
1-12求解n元一次方程组:用solve函数求解
%写法一:
clc,clear;
syms x1 x2 x3 x4
[x1,x2,x3,x4]=solve('x1+x2-3*x3-x4=1','3*x1-x2-3*x3+4*x4=4','x1+5*x2-9*x1-8*x4')
上面这个写法在新版本的语法貌似出了点问题,如果在新版本的matlab里会报错,写法二就不会
下面是官方文档的解释,翻译过来就是字符串输入向量这种方法已经被移除了。
%写法二:
clc,clear
syms x1 x2 x3 x4;
[x1,x2,x3,x4]=solve([x1+x2-3*x3-x4==1,3*x1-x2-3*x3+4*x4==4,x1+5*x2-9*x3-8*x4==0])
1-13
了解求导函数dff的用法
clc;clear;
syms x;
f(x)=(tan(x)+sin(x))^2;
diff(f(x))
1-14
了解求积分的函数int,这里最好加上一个常数C
clc;clear;
syms x C
f=(x^2+1)/(x^2-2*x+2)^2;
I=int(f)+C
1-15
同上
clc;clear;
syms x C
f=sin(x)*sin(x);
I=int(f,0,inf)+C
1-16
这个大矩阵看似很麻烦,实际上可以由四个10*10矩阵拼凑而成
即一个全0,一个全1,还有两个对角线和上半角均相同,区别是一个下半角是全1矩阵,另外一个则为全0矩阵。
理清楚之后,我们就开始拼凑,右边的两个矩阵很简单,不赘述。重点是左边的两个矩阵。对于对角线矩阵,有一个很重要的特征就是i==j。再特殊处理一下左上角的矩阵的下三角部分。对于下三角,矩阵的角标满足i>j的关系。最后将四个矩阵按照对应位置拼凑即可 (极其像在搭积木)。
clc;clear;
a=zeros(10,10);
b=zeros(10,10);
c=zeros(10,10);
d=ones(10,10);
k=1;
for i=1:10
for j=1:10
if i==j
a(i,j)=k*10;
c(i,j)=k*10;
k=k+1;
elseif i>j
a(i,j)=1;
end
end
end
s=[a b;c d]