数学类函数题型

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变量省事很多。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值