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

大二博客总结第五周 (未完)

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

大二博客总结第五周 (未完)

1.进制转换问题
2.数论板块
模运算
快速幂
GCD和LCM
扩展欧几里得算法与二元一次方程的整数解
同余和逆元
素数
3.洛谷题解(贪心,DP,搜索)


进制转换问题

P1143 进制转换
先有n进制数转化为十进制,再由十进制转化为m进制
1.字符转化为数字
2.数字转化为字符
3.本体最大的一个坑。转化为m进制的输出格式是有顺序的!!先转化的在后面

int change(char ch)
{
    return int(ch-'0');         //字符转化为数字
}
char ch1(int ch)
{
    return char(ch+'0');
}
int main()
{
    int n;cin>>n;
    string s;cin>>s;
    int m;cin>>m;
    int ans=0,k=1;
    for(int i=s.length()-1;i>=0;i--)
    {
        ans+=change(s[i])*k;
        k*=n;
    }
    string tmp="";
    while(ans)
    {
        tmp=ch1(ans%m)+tmp;     //本体最大的坑,不能写成  tmp+=ch1(ans%m);   顺序错误
        ans/=m;
    }
    cout< 

P1604 B进制星球
(主要用到高精度计算,进位问题,关键在与逆序存储字符串,输出顺序,和转化问题)
1.现将给定的两个字符串存到整型数组中
2.在进行高精度加减操作
3.去除前导0
4.输出再从后往前输出
代码思路写的还是很清晰的

int num1[2005],num2[2005],num[2005];
char s1[2005],s2[2005];
int main()
{
    int B;cin>>B;
    cin>>s1>>s2;
    int k1=strlen(s1),k2=strlen(s2);
    for(int i=0;i='A')
            num1[k1-i]=s1[i]-'A'+10; //字符串逆序存储到数组当中
        else
            num1[k1-i]=s1[i]-'0';    //解决高位进1的问题
    }
    for(int i=0;i='A')
            num2[k2-i]=s2[i]-'A'+10;
        else
            num2[k2-i]=s2[i]-'0';
    }
    int k=0,b=0;
    while(k<=k1||k<=k2)
    {
        k++;
        num[k]=num1[k]+num2[k]+b;
        b=num[k]/B;num[k]%=B;
    }
    while(num[k]==0&&k>1) k--;
    for(int i=k;i>=1;i--)
    {
        if(num[i]<10) cout< 
模运算 

除法的取模需要用到逆元

(a+b) mod m=((a mod m)+(b mod m)) mod m
(a-b) mod m=((a mod m)-(b mod m)) mod m
(a*b) mod m=((a mod m)*(b mod m)) mod m

P7521 [省选联考 2021 B 卷] 取模
看到个不太正规的做法。为了求最大的取模得到的数,盲猜是肯是从最大的几个数中选取,于是对于最大的几个数进行遍历,当遍历到最后6个的时候,便可以AC。

    sort(a+1,a+1+n);
    for(int k=n-5;k<=n;k++)
    {
        for(int i=n-5;i<=n;i++)
        {
            if(i==k) continue;
            for(int j=i+1;j<=n;++j)
            {
                if(j==k) continue;
                ans=max(ans,(a[i]+a[j])%a[k]);
            }
        }
    }
    cout< 
快速幂 

分治法实现

int fastpow(int a,int n)
{
    if(n==1) return a;
    int tmp=fastpow(a,n/2);
    if(n%2==1)
        return tmp*tmp*a;
    else
        return tmp*tmp;
}
int main()
{
    int a,n;
    cin>>a>>n;
    cout< 

采用位运算实现快速幂

int fastpow(int a,int n)
{
    if(n==1) return a;
    int tmp=fastpow(a,n/2);
    if(n%2==1)
        return tmp*tmp*a;
    else
        return tmp*tmp;

快速幂取模:

a的n次方 mod m =(a mod m)的n次方 mod m ;

矩阵快速幂模板
HDU 2817

#include
using namespace std;
const int maxn=2;
const int mod=1e4;
struct matrix
{
    int m[maxn][maxn];
    matrix()
    {
        memset(m,0,sizeof(m)); //对于矩阵初始化
    }
};
matrix mul(matrix a,matrix b)
{
    matrix c;
    for(int i=0;i>=1;
    }
    return tmp;
}
int main()
{
    matrix a1;
    for(int i=0;i>a1.m[i][j];
    int n;
    cin>>n;
    matrix a2=fastpow(a1,n);
    for(int i=0;i 
GCD和LCM 

GCD(最大公约数): return b==0 ? a:gcd(b,a%b);
LCM ( 最小公倍数 ) : return a/ gcd(a,b)*b;

P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
(需要注意的是:如果最大公约数和最小公倍数是同一个数,也就是两个数相等的情况下,就一组)

#include 

using namespace std;
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
int lcm(int a,int b)
{
    return a/gcd(a,b)*b;
}
int main()
{
    int x,y;
    cin>>x>>y;
    int num=x*y;
    int ans=gcd(x,y); //最小公约数
    int cot=lcm(x,y); //最大公倍数
    int p=0;
    if(x!=ans)
        cout<<0< 
扩展欧几里得算法和二元一次方程的整数解
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/303201.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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