栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

总结(取余,快速幂 , c++STL 库部分容器的使用)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

总结(取余,快速幂 , c++STL 库部分容器的使用)

一.取余

​ (1)两数相加取余:

​ (a + b) % p = (a % p + b % p) % p

​ (2)两数相减取余:

​ (a - b) % p = (a % p - b % p) % p

​ a或者b小于零的情况下对p取余看,

​ a每次加p直到为正数为止,再对p取余

​ 代码:

#include 
using namespace std;

int abs(int a, int b) {
    while (a < 0) {
        a += b;
    }
    return a;
}

int mode(int a, int b) {
    if (a >= 0) {
        return a % b;
    }
    else {
        return abs(a, b) % b;
    }
}

int main()
{
    cout << mode(-2, 5) << endl;

    return 0;
}

​ (3)两数相乘取余:

​ (a * b) % p = (a % p * b % p) % p

​ (4)两数相除取余:

​ 逆元法
( A / B ) % C
= ( A * B^(-1) ) % C
= ((A % C) * ( B^(-1) %C ))%C

	( B ^ ( -1 ) ) % C
	如果 B C 互质  则存在一个整数X 使得 b^( -1 ) ≡ X ( mod C ) 则 X 称为 B 模 C 的乘法逆元 
	记 X = B^(-1)   BX ≡ 1(mod C)
	例
	(2/5)%7
	= ( ( 2%7) * ( 5^(-1) %7) ) %7   // 5 与 7 互质  当 X = 3 时  ( 5*3  ) mod C = 1
	=(( 2 % 7) * (3 % 7) ) % 7
	= 6
二:快速幂

​ 对于任意求幂

		M^(N)
		
​		= M^(X1+X2+X3..+Xn)

​		=M^(X1) * M(X2)... * M(Xn)

		=M^( 2 ^ (n)  * j)  *  M^( 2 ^ (n-1)  * j) *...*M^( 2 ^ (0)  * j)    	
		
		 //j 为 N二进制第 n 位上的值
		 //循环 维护 2^(n) 的值

例:

		3^(13)

​		13的二进制为  1101

​			3^(13)

	​	=3^(8 * 1) *  3^(4 * 1) * 3^(2 * 0) * 3^(1 * 1)
	
		=3^(2^(3) * 1) *  3^(2^(2) * 1) * 3^(2^(1) * 0) * 3^(2^(0) * 1)
		

代码

int pow(int n, int X,int max) {
    int re = 1, a = n;
    while (X != 0) {
        if (X % 2) {
            re *= n;
            re %= max;
        }
        n *= n;
        n %= max;
        X /= 2;
    }
    return re;
}
三:阶乘取模

​ a!%b

​ 当 a 的值大于等于 b 的最大质因数时 值为0

​ 例如

​ a! % 666 666 最大的质因数为 111 所以当 a>=111 时 a!666 = 0

四:大数取余

​ 使用数组模拟,按位单独取余 再求和即可

int Mode(char* s, int len,int n) {
    int i, x = 1;
    int sum = 0;

    for (i = 0; len - 1 - i >= 0; i++) {
        sum += (s[len - i - 1] - '0') * x % n;
        x *= 10;
        sum %= n;
    }

    return sum;
}

五:C++STL库

​ (1)可变数组vector

#include 
using namespace std;

int main()
{
    vector arr;//定义vector数组  初始长度为0

    cout << arr.size() << endl;//数组长度

    arr.push_back(10);//在数组尾部添加一个元素

    if (arr.size() != 0) {
        arr.pop_back();//删除尾部的一个元素  只有数组中有元素时才能进行此操作
    }

    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i] << "  ";// 遍历数组  与普通数组一样
    }

    for (auto i : arr) {
        cout << i << "  ";//增强版for  
    }


    return 0;
}

(2)字符串 string

#include 
using namespace std;


int main()
{
    string a, b;

    //字符串拼接

    a = "Hello";
    b = " World";
    a += b;
    cout << a << endl; //输出的值为 Hello World
    
    sort(a.begin(), a.end());//排序

    reverse(a.begin(), a.end());//反转字符串

	return 0;
}

(3)队列 queue

#include 
using namespace std;


int main()
{
    queue qu;//新建队列

    cout << qu.size() << endl;// 队列长度

    qu.push(5);//添加元素

    if (qu.size() > 0) {//当队列不为空时才能访问
        cout << qu.front() << endl;
    }


    if (qu.size() > 0) {
        qu.pop();//出队 当队列不为空时
    }
	
    return 0;
}

​ (4)栈 stack

#include 
using namespace std;

int main()
{
    stack sta;//新建栈

    cout << sta.size() << endl;//获取栈大小

    sta.push(2);//入栈

    if (sta.size() > 0) {
        cout << sta.top() << endl;//获取栈顶元素
    }

    if (sta.size() != 0) {
        sta.pop();//出栈
    }
    
    return 0;
}

​ (5) set 一个 去重 有序 的集合

#include 
using namespace std;


int main()
{
    set se;

    se.insert(10);//插入元素

    int len = se.size();//获取大小
    
    se.erase(1);//删除元素  如果没有则不删除

    int min = *se.begin();//获取集合最小值

    int max = *se.rbegin();//获取集合最大值

    se.count(5);//查询值是否存在

    for (auto i : se) {//遍历
        cout << i << endl;
    }
    
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/868954.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号