1.计算组合数C(m,n)的值。
思路:组合数C(m,n)为从m个数中任意取出n个数的所有情况数。
计算方法:C(m,n)=m! / ( (m-n)! n! )
2.求最大公约数
常规法: 递规法:
int gcd(int x,int y) int gcd( int x,int y)
{ {
int r=x%y; return y==0? x: gcd(y,x%y);
while(r) }
{
x=y;
y=r;
r=x%y;
}
return y;
}
3.求最小公倍数 // 最小公倍数为两个数的乘积/两个数的最大公约数;int lcm()
{
return x*y/gcd(x,y);
}
4.判断素数
int prime(int x)
{
if(x==2) return 1;
int j=2;
while(j<=sqrt(x)&&x%j!=0) j++;
if(x%j==0)
return 0;
else
return 1;
}
5.数字反转
void fz(int x)
{
int s=0;
while(x)
{
s=s*10+x%10;
x/=10;
}
cout<<s;
}
6.倒序输出
递归法 :
void print (int x)
{
cout<<x%10;
if(x>=10)
print(x/10);
}
常规法:
void print (int x)
{
int a;
while(x<0)
{ cout<<"-";
x=abs(x); }
while(x)
{
a=x%10;
x/=10;
cout<<a;
}
}
7. 如果一个数从左边读和从右边读都是同一个数,就称为回文数。例如6886就是一个回文数,求出所有的即是回文数又是素数的三位数。
解法一:既判断素数又判断回文数
#include<bits/stdc++.h>
using namespace std;
int sh(int i);
int main()
{
for(int i=100;i<=999;i++)
{
if((sh(i)==true)&&((i/100)==(i%10))) //判断即是素数又是回文数;
cout<<i<<endl;
}
return 0;
}
int sh(int i) //判断素数;
{
bool f=false;
int x=2;
while(x<=sqrt(i)&&(i%x!=0))
x++;
if(x>sqrt(i))
f=true;
return f;
}
解法二:(注意学习三位数的表示方法)
先找回文数,在回文数中判断素数
#include<bits/stdc++.h>
using namespace std;
bool sh(int n);
int main()
{
for(int a=1;a<=9;a++) //枚举个位与百位;
for(int b=0;b<=9;b++) //枚举十位;
if(sh(a*100+b*10+a)) //在回文数中判断素数;
printf("%d\n",a*100+b*10+a);
return 0;
}
bool sh(int n) //判断素数;
{
int i;
for(i=2;(i<=sqrt(n)&&n%i!=0);i++);
if(i==(int)sqrt(n)+1)
return 1;
else
return 0;
}
8.斐波那契数列
常规法: 递归法:
void fbsl (int x) int nm (int n)
{ {
int a=1,b=1,c; if(n==1) return 0;
for(int i=3;i<=x;i++) else if(n==2) return 1;
{ else return nm(n-1)+nm(n-2);
c=a+b; }
a=b; //由于包含n-1和n-2两种情况,所以应判断两种递归边界情况
b=c;
}
cout<<b;
}
9.完全数:因子之和等于它本身的自然数。eg:6=1+2+3
10.自然数a的因子是指能将a整除的所有自然数,但不含a本身。eg:12的因子为1,2,3,4,6.若自然数a的因子之和为b,且b的因子之后为a,则称a,b为一对“亲和数”。求最小的一对亲和数(a!=b)
#include<iostream>
using namespace std;
int num(int n)
{
int s=0;
for(int i=1;i<=n/2;i++)
if(n%i==0)
s=s+i;
return s; //num(n)为n的因子之和;
}
int main()
{
for(int i=1;;i++) //从1开始枚举自然数;
if((num(num(i))==i)&&(i!=num(i))) 善于运用所设的变量去表达含义
{ //num(num(i))为i的因子之和的因子之和;
cout<<i<<" "<<num(i)<<endl;
break; //找到最小亲和数就退出;
}
return 0;
}
11.素数对
两个相差为2的素数称为素数对,如5和7,要求找出所有两个数均不大于n的素数对
int main()
{
int n;bool q=1; //定义了一个bool变量;
cin>>n;
for(int i=3;i<=n-2;i++) //3和5是第一对素数对,因此从3开始即可;
if(ss(i)&&ss(i+2))
{
cout<<i<<" "<<i+2<<endl; //如果存在素数对就输出;
q=0;
}
if(q==1)
cout<<"empty"; //不存在素数对就输出empty;
}
注意:当只考虑两种情况时,使用一个bool变量省事很多。