最大公约/最小公倍/素数/质因子/组合数/排列/回文
1、最大公约数和最小公倍数
#include <iostream>
using namespace std;
int gcd(int a, int b)
{
return !b ? a : gcd(b, a%b);
}
int main()
{
int m,n;
cin>>m>>n;
cout<<gcd(m,n)<<endl; //最大公约数
cout<<m*n/gcd(m,n)<<endl; //最小公倍数
return 0;
}
2、素数
bool IsPrime(int n)
{
if(n<=1) return false;
int sqr = (int)sqrt(1.0*n); //若n没有接近int型范围的边界,
for(int i=2;i<=sqr;i++) //防止溢出,可直接写为i*i<=n;
{
if(n%i==0) return false;
}
return true;
}
//1~100以内的素数
for(int i=1;i<100;i++)
for(int j=2;j<i;j++)
{
if(i%j==0) break;
if(i==j+1) cout<<i<<" ";
}
3、质因子
#include <iostream>
using namespace std;
int main()
{ long n;
while (cin >> n)
{
while(n != 1)
{
for(int i = 2; i <= n; i++)
{
if(n % i == 0)
{
n /= i;
cout << i << ' '; //输出质因子
break;
} }
}}
return 0;
}
//计算n!里面有多少质因子p
int cal(int n, int p)
{
int ans=0;
while(n)
{
ans += n/p;
n/=p;
}
return ans;
}
//n!的末尾有多少个0,等同于p=5情况下的结果
4、组合数

long long ans[80][80]={0};
long long cal(long long n, long long m)
{
if(m==0 || m==n) return 1;
if(ans[n][m] !=0) return ans[n][m];
return ans[n][m] = cal(n-1,m) + cal(n-1,m-1);
}
5、全排列
#include
using namespace std;
int main(){
int n;
while(cin>>n)
{
int a[1000];
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
do{ //主程序
for(int i=0;i<n;i++)
cout<<a[i];
cout<<endl;
}while(next_permutation(a,a+n));
}
return 0;
}
6、判断数字是否回文
bool Hui(int n)
{
if(n<0 ||(n!=0 && n%10==0)) return false;
int rev=0;
while(n>rev)
{
rev = rev*10 + n%10;
n/=10;
}
return (n==rev || n==rev/10);
}
浙公网安备 33010602011771号