目录
最大公约数
两个数的最大公约数
之前看见的是辗转相除法,例如现在让算一个49,21的最大公约数
cpp
#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;
加上过程的打印:
cpp
#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;
}
运行结果如下图:
多个数的最大公约数
可以先把前两个数的最大公约数求出来之后,在依次和剩下的数进行辗转相除,求出一组数的最大公约数
cpp
#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;
}
最小公倍数
两个数的最小公倍数
最小公倍数数的求法,一般是将两个数相乘,然后除两个数的最大公约数,下面是具体代码:
cpp
#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;
}
多个数的最小公倍数
也是同求多个数的最大公约数一样,先求出前两个的最小公倍数,然后依次于剩下的数求出整个数组的最小公倍数。代码如下:
cpp
#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和他本身的数
cpp
#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;
}
结果如下
位数分离
有时候会给一些数,然后让分离每个位数的数字,有时候是正写,有时候是反写
正写
正写老师教过递归的写法,但是有些不熟练,我这里的方法是先统计这个数是几位数,然后依次除。
cpp
#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;
}
结果如下
反写
根据模的特点
cpp
#include<iostream>
using namespace std;
int main()
{
int a=12345678;
while(a)
{
cout<<a%10<<' ';
a/=10;
}
return 0;
}
结果如下
闰年
不是百年的时候,每四年一闰,
是百年的时候,四百年一闰
cpp
#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;
}
结果