机试笔记7--数学问题

1.同模余定理

定义

所谓的同余,顾名思义,就是许多的数被一个数d去除,有相同的余数。d数学上的称谓为模。如a=6,b=1,d=5,则我们说a和b是模d同余的。因为他们都有相同的余数1。

应用

(a+b)%c=(a%c+b%c)%c;--1

(a-b)%c=(a%c-b%c)%c;--2

(a*b)%c=(a%c*b%c)%c;--3

例题

S(n)=n^5  求S(n)除以3的余数

这里的问题是用long long,n的5次幂会越界,所以可以用上面的公式3来进行运算。

2.最大公约数

int gcd(int a,int b)
{
     if(b==0)
        return a;
     else return gcd(b,a%b);  
}
int GDC(int a,int b)
{
    int temp=a<b?a:b;
    for(;temp>0;temp--){
      if((b%temp==0)&&(a%temp==0)){
        break;
      }
    }
    return temp;
}

例题1

给出n个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的组合。

就是求两个数的最大公约数为1的个数

例题2

分数化简,同除以两个数的最大公约数就可以了

3.最小公倍数(LCM)

LCM(x, y) = x * y / GCD(x, y)

4.斐波那契数列

F(n) = F(n-1) + F(n-2)

5.素数判定

只需要从2遍历搭配sqrt(n)就行了

6.全排列

对字符串进行全排列

方法1.使用next_permutation(start,end)

#include<bits/stdc++.h>
using namespace std;
int main(){
    char s[100];
    cin>>s;
    int len=strlen(s);
    sort(s,s+len);
    
    do{
        cout<<s<<endl;
    }next_permutation(s,s+len);
        return 0;
}

2.递归

终止条件:if(begin>=end) 输出

permutation(arr,begin,end)=permutation(arr,begin+1,end)即一个数组的全排列等于它的所有子排列

#include <bits/stdc++.h>
using namespace std;
void swap(int &a,int &b)
{
   int temp=a;
   a=b;
   b=temp;
}

void permutation(int a[],int s,int e)
{
   if(s>=e){
     for(int i=0;i<e;i++){
        cout<<a[i];
     }
     cout <<endl;
   }
   else{
      for(int i=s;i<e;i++){
        swap(a[s],a[i]);
        permutation(a,s+1,e);
        swap(a[s],a[i]);
      }

   }
}
int main()
{
  int source[30];
    int i, count;

    scanf("%d", &count);

    // 初始化数组
    for (i = 0; i < count; i++)
    {
        source[i] = i + 1;
    }
    permutation(source,0,count);
    return 0;
}
 
原文地址:https://www.cnblogs.com/Sunqingyi/p/12638849.html