1、辗转相除法
两个正整数m,n的最大公约数
因为m与n和r都相关,所以求m和n的最大公约数等价于n和r的最大公约数
辗转相除法:欧几里得
①求 m除以n的余数r r=m%n
②当r!=0时,执行第③步,当r=0时,n就是最大公约数
③让m=n,n=r,再求m除以n的余数r (新的m=原来的n 新的n=原来的r)
④转到第②步
当r!=0时,执行第③步,当r=0时,结束循环执行输出
#include <bits/stdc++.h>
using namespace std;
int main(){
int m,n,r;
m=14;n=4;
r=m%n;//①2
while(r!=0){
m=n;//③
n=r;
r=m%n;//0
}
cout<<n;
/*
if(r!=0){//②
m=n;//③
n=r;
r=m%n;//
}
else{
cout<<n;
}
if(r!=0){//②
m=n;//③
n=r;
r=m%n;//
}
else{
cout<<n;
}
*/
}
2、函数递归
递归问题:用于处理原问题以及与原问题规律相同的子问题
奇数数列,输出第n个数的值
斐波那契数列,1 1 2 3 5 8 13,该数等于前两个数之和
汉诺塔:源于印度的古老传说,大梵天创造世界的时候做了3根金刚石柱子,一根柱子从下往上按照从大到小的顺序
摞着64片黄金圆盘,大梵天命令婆罗门把圆盘从下面开始按照从大到小的顺序重新摆放在另一根柱子上,并规定,小圆盘
上不能放大圆盘,3根柱子之间一次只能移动一个圆盘,问:一共需要移动多少次,才能按照要求移完这些圆盘
如果按规则移动64个圆盘,需要移动次数为18 446 744 709 551 615次,所以只谈论圆盘数量较少的情况
移动规律
1、A的n-1个移动到B
2、A的最后一个大的移动到C
3、B上面的n-1个移动到C
即f(n)=2f(n-1)+1
#include <bits/stdc++.h>
using namespace std;
int f(int n){
if(n==1){
return 1;
}
else{
return f(n-1)+2;
}
}
int fib(int k){//k=3
if(k<2){
return k;}
else{
return fib(k-1)+fib(k-2);//fib(3)=fib(2)+fib(1) fib(2)= fib(1)+fib(0)
}
}
int hannuota(int n){
if(n==1){
return 1;
}
else{
return 2*f(n-1)+1;
}
}
int main(){
cout<<hannuota(2);
}
3、冒泡排序
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。
可以先写顺序结构,再转换为循环结构。
顺序结构变成循环结构方法,找到重复的次数,将重复内容放入循环体,观察发生变化的变量的变化规律。
#include <bits/stdc++.h>
using namespace std;
int main(){
int temp;
int a[10]={1,2,3,4,5,6,7,8,9,10};
for(int j=9;j>0;j--){
for(int i=0;i<j;i++){
if(a[i]<a[i+1]){
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
for(int i=0;i<10;i++){
cout<<a[i]<<endl;
}
}
4、分离位数
获取一个数的个位,十位,百位等文章来源:https://www.toymoban.com/news/detail-739298.html
#include <bits/stdc++.h>
using namespace std;
int main(){
int a=12345;
while(a!=0){
cout<<a%10<<endl;//5
a=a/10;
}
} /*
a%10;//5
a=a/10//1234
a%10; //4
a=a/10;//123
a%10;//3
a=a/10;//12
a%10;//2
a=a/10;//1
a%10;//1
a=a/10;//0 */
5、文章来源地址https://www.toymoban.com/news/detail-739298.html
到了这里,关于c++小学生入门教程(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!