最大公约/最小公倍/素数/质因子/组合数/排列/回文

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);
}

  

posted @ 2018-06-29 00:29  道微真理  阅读(173)  评论(0)    收藏  举报