最大公约数
两个数的最大公约数
之前看见的是辗转相除法,例如现在让算一个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; }
结果