matlab脚本编程习题3
第三次作业:switch和循环
1.从键盘输入两个数和运算符,用switch语句实现一个简单的四则运算计算器。采用循环设置10个题目,输出做对多少题。
题目描述不太清晰,不必纠结,就是写个四则运算器
count=0;
for i=1:10
fprintf('第%d题\n',i);
x=input('x=');
y=input('y=');
m=input('input the + or - or * or /:','s');
answer=input('input your answer:');
result=0;
switch m
case '*'
result=x*y;
fprintf('x*y=%.4f\n',result);
case '/'
if y==0
result=NaN;
fprintf('error');
else
result=x/y;
fprintf('x/y=%.4f\n',result);
end
case '+'
result=x+y;
fprintf('x+y=%.4f\n',result);
case '-'
result=x-y;
fprintf('x-y=%.4f\n',result);
end
if answer==result
count=count+1;
end
end
fprintf('total right: %d',count);
2.百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡, 其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱
我一开始还以为是贪心来着。。是我想多了
代码里的步长4、7是解方程得的,i,j的初值是逆推出来的,只是为了降低算法复杂度而已
for i=0:4:15
for j=4:7:26
k=100-i-j;
if (i*7+4*j==100)&&(mod(k,3)==0&&(i*j*k~=0))
fprintf('公鸡%d只,母鸡%d只,小鸡%d只\n',i,j,k);
end
end
end
3.验证哥德巴赫猜想:任何一个大于4的偶数都可以表示为两个素数的和。
验证猜想也就是把数num拆成两个数x和num-x嘛
遍历x可能的值,同时num-x也为素数就可以证明了
sushu.m
用了函数,sushu判断数字n是否为素数,判断大于2的数是否为素数的方法自行百度~
function [k]=sushu(n)
k=1;
if n==2
k=1;
else
for i=2:round(sqrt(n))
if (mod(n,i)==0)
k=0;
end
end
end
homework3_3.m
第一种,输出6-2000以内的偶数,并表示为两素数之和的形式,跟百钱百鸡类似
for i=6:2:2000
for x=2:2000
y=i-x;
flag1=sushu(x);
flag2=sushu(y);
if flag1*flag2==1
fprintf('%d=%d+%d\n',i,x,y);
break;
end
end
end
第二种,随便输入一个数并验证哥德巴赫猜想
n=input('输入任意大于4的偶数:');
for x=2:n-1
y=n-x;
flag1=sushu(x);
flag2=sushu(y);
if flag1*flag2==1
fprintf('%d=%d+%d\n',n,x,y);
break;
end
end
4.输入一个10进制整数,转换为二进制输出。
最坑的地方在于matlab里没有数据类型,默认不会向下取整,注意数组维度
n=input('请输入一个10进制整数(0~1023):');
A=zeros(1,10);
i=1;
while 1
A(i)=floor(mod(n,2));
n=floor(n/2);
i=i+1;
if n==0
break;
end
end
for i=10:-1:1
fprintf('%d',A(i));
end
5.斐波那契数列:又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(3)=2,F(n)=F(n-1)+F(n-2)(n>=4,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
要求:(1)编写函数fibo,功能是求斐波那契数列的第n项。(2)编写测试脚本,调用fibo函数,输出斐波那契数列的前30项。
用了递归,简单理解就是 根据递推式F(n)=F(n-1)+F(n-2)
只要有初项F(1)F(2),后面所有项都可以递推地求出来,在程序中就表现为我自己调用我自己,感兴趣可以再去做做汉诺塔问题
fibo.m
function [x]=fibo(n)
if n==1||n==2
x=1;
else
x=fibo(n-2)+fibo(n-1);
end
homework3_5.m
for i=1:30
f=fibo(i);
fprintf('斐波那契数列第%d项为:%d\n',i,f);
end