A. c语言循环结构-迭代
1.迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。此过程的每一次结果,都是由对前一次所得结果施行相同的运算步骤得到的。例如利用迭代法*求某一数学问题的解。
对计算机特定程序中需要反复执行的子程序*(一组指令),进行一次重复,即重复执行程序中的循环,直到满足某条件为止,亦称为迭代。
2.基本算法
有些国外的教材,如《C++ Primer》第四版的中文版,会把iterative翻译成迭代。
在java中Iterative 仅用于遍历集合,本身并不提供盛装对象的能力。如果需要创建Iterative对象,则必须有一个被迭代的集合。没有集合的Iterative仿佛无本之木,没有存在的价值。
iterative是反复的意思,所以,有时候,迭代也会指循环执行,反复执行的意思。
利用迭代算法解决问题,需要做好以下三个方面的工作:
确定变量
在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
建立关系式
所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
过程控制
在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。
例1 : Fibonacci Sequence(斐波那契数列)
即这样一个数列:0、1、1、2、3、5、8、13......,在数学上该数列定义为:
F(0)=0,F(1)=1; F(n) = F(n-1)+F(n-2) (n≥2,n∈N*)。
一般该数列可以递归实现,下面是用C语言 迭代 实现:
intfab(intn)
{if(n<3)
{return1;}
else
{intfirst=1,second=1,temp=0;
for(inti=0;i<n-2;i++)
{temp=first+second;
first=second;
second=temp;}
returntemp;
}
}
例2 :验证角谷猜想。日本数学家角谷静夫在研究自然数时发现了一个奇怪现象:对于任意一个自然数
n ,若 n 为偶数,则将其除以 2 ;若 n 为奇数,则将其乘以 3 ,然后再加
1。如此经过有限次运算后,总可以得到自然数1。人们把角谷静夫的这一发现叫做“角谷猜想”。
要求:编写一个程序,由键盘输入一个自然数n ,把 n 经过有限次运算后,最终变成自然数 1 的全过程打印出来。
分析:定义迭代变量为 n ,按照角谷猜想的内容,可以得到两种情况下的迭代关系式:当 n 为偶数时, n=n/2 ;当 n 为奇数时, n=n*3+1。用c 语言把它描述出来就是:
以下是引用片段:
if(n%2==0)//如果n是偶数
{
n=n/2;
}
else
{
n=n*3+1;
}
这就是需要计算机重复执行的迭代过程。这个迭代过程需要重复执行多少次,才能使迭代变量n
最终变成自然数1 ,这是我们无法计算出来的。因此,还需进一步确定用来结束迭代过程的条件。仔细分析题目要求,不难看出,对任意给定的一个自然数n
,只要经过有限次运算后,能够得到自然数 1 ,就已经完成了验证工作。因此,用来结束迭代过程的条件可以定义为:n=1。参考程序如下:
以下是完整程序:
#include<stdio.h>
intmain()
{
intn;
printf("Pleaseinputn= ");
scanf("%d",&n);
printf("%d ",n);
while(n!=1)
{
if(n%2==0)//如果n是偶数
{
n=n/2;
printf("->/2=%d ",n);
}
else
{
n=n*3+1;
printf("->*3+1=%d ",n);
}
}
}
B. C语言 角谷猜想 要求验证角谷猜想,从键盘上输入一个自然数n,输出所有n到1经历的所有数。
没用过C语言 用PYTHON给你写一个 你可以照着改改
num=6
print(num,end='')
while(num!=1):
if(num%2)==0:#偶数
num=num//2
else:#奇数
num=num*3+1
print(num,end='')#63105168421
C. c语言角谷定理求次数
下面的程序先从键盘上给我一个整数X。然后如果它是奇数就乘以3+1。否则就除以2。并且同时记录次数,当X的值变为E的时候,停止循环输出处理的次数。
#include <stdio.h>
int main()
{ int n=0,x;
scanf("%d",&x);
while(x!=1)
{if(x%2)x=3*x+1;
else x/=2;
n++;
}
printf("%d\n",n);
return 0;
}
D. c语言与角谷猜想
#include<stdio.h>
main()
{int
a,b,count;
printf("请输入a的值,以便检验角谷猜想。\na=");
scanf("%d",&a);
b=a;
while
(a!=1)
{if
(a>1&&a%2==0)
{a=a/2
;printf
("→%d\n",a);}
else
{a=3*a+1;printf("→%d\n",a);}
count++;}printf("%d需经过%d步才得到1.",b,count);}
//如果能够逆推出,比方说,23的下一步是70,那么都有哪些数的下一步是70?如此逆推,就能写成一棵"数论树".
E. 验证角谷猜想 c语言
if (count!=0)
printf("\b\n");加个\b退位
F. 角谷猜想,C语言,输出过程
代码比较简单,各语句意义见注释。。。
#include<stdio.h>
intmain(intargc,char*argv[])
{
inti;/*定义要处理的变量*/
scanf("%d",&i);/*输入变量值*/
while(i!=1)
{
if(i%2)/*奇数*/
{
printf("%d*3+1=%d ",i,i*3+1);/*按题目要求的格式打印出来*/
i=i*3+1;/*更新变量值*/
}
else/*偶数*/
{
printf("%d/2=%d ",i,i/2);/*按题目要求的格式打印出来*/
i=i/2;/*更新变量值*/
}
}
printf("END ");/*最后打印END*/
return0;
}
另外几个测试结果图片:
G. 在C语言中什么叫做脚骨定理
是“角谷猜想”
也叫冰雹猜想
冰雹猜想 [1] 是指:一个自然数x,如果是奇数就乘以3再加1,如果是偶数就析出偶数因数2ⁿ,这样经过若干个次数,最终回到1。 [2]
无论这个过程中的数值如何庞大,就像瀑布一样迅速坠落。而其他的数字即使不是如此,在经过若干次的变换之后也必然会到纯偶数:16-8-4-2-1的循环。据日本和美国的数学家攻关研究,在小于7*10^11的所有的自然数,都符合这个规律。