目录
最大公约数
两个数的最大公约数
多个数的最大公约数
最小公倍数
两个数的最小公倍数
多个数的最小公倍数
素数
编辑
位数分离
正写
编辑
反写
闰年
最大公约数
两个数的最大公约数
之前看见的是辗转相除法,例如现在让算一个49,21的最大公约数
#include<iostream>
using namespace std;
int main()
{int a=49,b=21;while(b!=0){int tmp=b;b=a%b;a=tmp;}cout<<a;return 0;}
模拟一下过程
刚开始a=49,b=21,循环判断b不等于0,进入循环,tmp=21,b=a%b=49%21=7,a=tmp=21;
现在a=21,b=7,循环判断b不等于0,进入循环,tmp=7,b=a%b=21%7=0,a=tmp=7;
现在a=7,b=0,循环判断b不等于0,循环结束;
打印a=7;
加上过程的打印:
#include<iostream>
using namespace std;
int main()
{int a=49,b=21;cout<<"a="<<a<<",b="<<b<<endl;while(b!=0){int tmp=b;b=a%b;a=tmp;cout<<"a="<<a<<",b="<<b<<endl;}cout<<endl<<a;return 0;}
运行结果如下图:
多个数的最大公约数
可以先把前两个数的最大公约数求出来之后,在依次和剩下的数进行辗转相除,求出一组数的最大公约数
#include<iostream>
using namespace std;
int gcd(int a,int b);
int gcd(int a,int b)
{while(b!=0){int tmp=b;b=a%b;a=tmp;}return a;
}
int main()
{int arr[4]={5,75,80,2000};int num=arr[0];for(int i=1;i<4;i++){num=gcd(num,arr[i]);}cout<<num;return 0;}
最小公倍数
两个数的最小公倍数
最小公倍数数的求法,一般是将两个数相乘,然后除两个数的最大公约数,下面是具体代码:
#include<iostream>
using namespace std;
int gcd(int a,int b)
{while(b!=0){int tmp=b;b=a%b;a=tmp;}return a;
}int main(){int a=21,b=7;cout<<a*b/gcd(a,b)<<endl;return 0;}
多个数的最小公倍数
也是同求多个数的最大公约数一样,先求出前两个的最小公倍数,然后依次于剩下的数求出整个数组的最小公倍数。代码如下:
#include<iostream>
using namespace std;
int gcd(int a,int b);
int gcd(int a,int b)
{while(b!=0){int tmp=b;b=a%b;a=tmp;}return a;
}
int main()
{int arr[4]={50,100,10,20};int num=arr[0];for(int i=1;i<4;i++){num=num*arr[i]/gcd(num,arr[i]);}cout<<num;return 0;}
素数
因数只有1和他本身的数
#include<iostream>using namespace std;bool isprime(int n){for(int i=2;i*i<n;i++){if(n%i==0)return false;}return true;}int main(){for(int i=2;i<100;i++){if(isprime(i))printf("%d\t",i);}return 0;}
结果如下
位数分离
有时候会给一些数,然后让分离每个位数的数字,有时候是正写,有时候是反写
正写
正写老师教过递归的写法,但是有些不熟练,我这里的方法是先统计这个数是几位数,然后依次除。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{int a=12345678;int num=a;//用来统计位数int t=0;while(num) {num/=10;t++;}while(t){t--;int i=a/pow(10,t);a=a-i*pow(10,t);cout<<i<<' ';}return 0;}
结果如下
反写
根据模的特点
#include<iostream>using namespace std;int main(){int a=12345678;while(a){cout<<a%10<<' ';a/=10; }return 0;}
结果如下
闰年
不是百年的时候,每四年一闰,
是百年的时候,四百年一闰
#include<iostream>
using namespace std;
bool leap(int year)
{if(year%400==0||year%100!=0&&year%4==0)return true;return false;}
int main()
{for(int i=1;i<1000;i++){if(leap(i))printf("%d\t",i);}return 0;
}
结果