请问要如何用matlab算出这个啊?
设A1=0和A2=1,且An定义为An1与An2从左到右连接起来所得到的数。例如:A3=A2A1=10,A4=A3A2=101,A5=A4A3=10110。找出使得An能...
设 A1 = 0 和 A2 = 1,且 An 定义为 An1 与 An2 从左到右连接起来所得到的数。
例如:A3 = A2A1 = 10, A4 = A3A2 = 101, A5 = A4A3 = 10110。找出使得 An 能够被
11 整除的所有 n 值。 展开
例如:A3 = A2A1 = 10, A4 = A3A2 = 101, A5 = A4A3 = 10110。找出使得 An 能够被
11 整除的所有 n 值。 展开
1个回答
展开全部
n=6k,k=1,2,3,4......
这个问题使用matlab直接解决是很困难的,因为这涉及到matlab的存贮格式,很难支持高位数的精确运算。当n=7的时候,matlab的计算精度就不足以支持了。
必须考虑使用“能被11整除的数的特征”,即把一个数由右边向左边数,将奇位上的数字与偶位上的数字分别加起来,再求它们的差,如果这个差是11的倍数(包括0),那么,原来这个数就一定能被11整除.
分析过程
1 由于数字只有0和1两种,因此在计算奇数位之和与偶数位之和时,只需要计算1的个数就可以了。将A(n)中奇数位里1的个数称作odd_A(n),将偶数位中1的个数称为even_a(n)。举例:odd_A(4)=2,even_A(4)=1;
2 将A(n)的位数称为length_A(n);
3 生成A(n)的过程中,A(n-1)是在向前移动length_A(n-2)位的。举例:在生成A(5)的过程中,A(4)向前移动了length_A(3)=2位;
4 如果向前移动奇数位,那么odd_A(n)由两部分构成,一部分是odd_A(n-2),它保持不变;另一部分是even_A(n-1),它是奇偶互换的。即odd_A(n)=odd_A(n-2)+even_A(n-1); 同理有当移动奇数位even_A(n)=even_A(n-2)+odd_A(n-1);
5 如果向前移动偶数位,那么odd_A(n)由两部分构成,一部分是odd_A(n-2),它保持不变;另一部分是odd_A(n-1),也保持不变。即odd_A(n)=odd_A(n-2)+odd_A(n-1); 同理有当移动偶数位even_A(n)=even_A(n-2)+even_A(n-1);
程序
**********************************************
clc;clear;
N=20;% 考虑小于N的解
a=zeros(N,1);length_a=zeros(20,1);odd_a=zeros(20,1);even_a=zeros(20,1);% 生成数组
a(1)=0;length_a(1)=length(a(1));odd_a(1)=0;even_a(1)=0;% 赋初值
a(2)=1;length_a(2)=length(a(2));odd_a(2)=1;even_a(2)=0;
for ii=3:20
length_a(ii)=length_a(ii-1)+length_a(ii-2);
if mod(length_a(ii-2),2)==1
odd_a(ii)=odd_a(ii-2)+even_a(ii-1);
even_a(ii)=even_a(ii-2)+odd_a(ii-1);
end
if mod(length_a(ii-2),2)==0
odd_a(ii)=odd_a(ii-2)+odd_a(ii-1);
even_a(ii)=even_a(ii-2)+even_a(ii-1);
end
if mod(odd_a(ii)-even_a(ii),11)==0
ii-1 % 有于matlab不支持数组从零开始,故需要减一
end
end
**********************************************************
结果输出
ii=6,12,18
这个问题使用matlab直接解决是很困难的,因为这涉及到matlab的存贮格式,很难支持高位数的精确运算。当n=7的时候,matlab的计算精度就不足以支持了。
必须考虑使用“能被11整除的数的特征”,即把一个数由右边向左边数,将奇位上的数字与偶位上的数字分别加起来,再求它们的差,如果这个差是11的倍数(包括0),那么,原来这个数就一定能被11整除.
分析过程
1 由于数字只有0和1两种,因此在计算奇数位之和与偶数位之和时,只需要计算1的个数就可以了。将A(n)中奇数位里1的个数称作odd_A(n),将偶数位中1的个数称为even_a(n)。举例:odd_A(4)=2,even_A(4)=1;
2 将A(n)的位数称为length_A(n);
3 生成A(n)的过程中,A(n-1)是在向前移动length_A(n-2)位的。举例:在生成A(5)的过程中,A(4)向前移动了length_A(3)=2位;
4 如果向前移动奇数位,那么odd_A(n)由两部分构成,一部分是odd_A(n-2),它保持不变;另一部分是even_A(n-1),它是奇偶互换的。即odd_A(n)=odd_A(n-2)+even_A(n-1); 同理有当移动奇数位even_A(n)=even_A(n-2)+odd_A(n-1);
5 如果向前移动偶数位,那么odd_A(n)由两部分构成,一部分是odd_A(n-2),它保持不变;另一部分是odd_A(n-1),也保持不变。即odd_A(n)=odd_A(n-2)+odd_A(n-1); 同理有当移动偶数位even_A(n)=even_A(n-2)+even_A(n-1);
程序
**********************************************
clc;clear;
N=20;% 考虑小于N的解
a=zeros(N,1);length_a=zeros(20,1);odd_a=zeros(20,1);even_a=zeros(20,1);% 生成数组
a(1)=0;length_a(1)=length(a(1));odd_a(1)=0;even_a(1)=0;% 赋初值
a(2)=1;length_a(2)=length(a(2));odd_a(2)=1;even_a(2)=0;
for ii=3:20
length_a(ii)=length_a(ii-1)+length_a(ii-2);
if mod(length_a(ii-2),2)==1
odd_a(ii)=odd_a(ii-2)+even_a(ii-1);
even_a(ii)=even_a(ii-2)+odd_a(ii-1);
end
if mod(length_a(ii-2),2)==0
odd_a(ii)=odd_a(ii-2)+odd_a(ii-1);
even_a(ii)=even_a(ii-2)+even_a(ii-1);
end
if mod(odd_a(ii)-even_a(ii),11)==0
ii-1 % 有于matlab不支持数组从零开始,故需要减一
end
end
**********************************************************
结果输出
ii=6,12,18
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询