每周学习小结

本周主要学习的是高精度算法和全排列算法。

先来讲讲高精算法,他主要是用来算加减乘除的,他的思想还是不难的。

先通过把字符串转化成数字的方法存进容器里,然后通过写一个容器的函数对存着数字的容器进行运算,最后返回容器的值就行了。

本文仅介绍一下核心代码

高精乘法:(这个比较不一样,是高精和低精进行运算)

vector<int> mul(vector<int> A,int b)  
{
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size()||t!=0;i++) //遍历完所有的数字  t!=0用来判断10的整数倍
    {
        if(i<A.size()) t+=A[i]*b;
        C.push_back(t%10);
        t/=10;
    }
    while(C.size()>1&&C.back()==0) C.pop_back();//b为0的时候删除前导0 
    return C;
}

高精加法:

vector<int> add(vector<int> A,vector<int> B) 
{
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size()||i<B.size();i++) //遍历完所有的数字 
    {
        if(i<A.size()) t+=A[i];
        if(i<B.size()) t+=B[i];
        
        C.push_back(t%10);//进位处理 
        t/=10;    
    }
    if(t) C.push_back(1);//最后存在前导1的时候加上1 
    return C;
}
 高精减法:

vector<int> sub(vector<int> A,vector<int> B)  //我们最后返回C的类型是数组,所以要开数组类型 
{
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size();i++) //遍历完所有的数字 
    {
        t=A[i]-t;//有没有借位的判断 
        if(i<B.size()) t-=B[i];
        C.push_back((t+10)%10);
        if(t<0) t=1;//t<0代表上面需要借位计算 
        else t=0;
    }
    
    while(C.size()>1&&C.back()==0) C.pop_back(); //删除前导0 
    return C;
}

高精除法(也是高精和低精的运算):

vector<int> div(vector<int> &A,int &b,int &r)  //我们最后返回C的类型是数组,所以要开数组类型 
{
    vector<int> C;
    r=0;
    for(int i=A.size()-1;i>=0;i--) //遍历完所有的数字 
    {
        r=r*10+A[i];//36 6
        C.push_back(r/b);
        r%=b;
    }
    reverse(C.begin(),C.end());//反过来输出 
    while(C.size()>1&&C.back()==0) C.pop_back();//b为0的时候删除前导0 
    return C;
}

然后是全排列:

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

通俗来讲:全排列,顾名思义全部排列,就是给出一个字符串,我们要把他的所有的排列方式全部写出来,如:ABC ,他的排列方式有,ABC,ACB,BAC,BCA,CAB,CBA。一共6种。如果字符越多排列方式也越多。

思路:

每个数据都依次放在第一位置,然后就是n-1个数据排列问题,在再重复操作,一直递归下去,直到a,b相等,递归结束

代码加注释:

//交换
void swap(int &a , int &b)//要加地址符 
{
    int temp;
    temp = a;
    a = b;
    b = temp;
 } 
 //全排列递归算法
void Perm(int list[] , int k ,int m) 
{
    //list 数组存放排列的数,K表示层 代表第几个数,m表示数组的长度
    if(k==m)
    {
        //K==m 表示到达最后一个数,不能再交换,最终的排列的数需要输出;
        for(int i=0;i<=m;i++)
         cout<<list[i];
         cout<<endl; 
     } 
     else{
         for(int i=k;i<=m;i++)
         {
             swap(list[i],list[k]);
             Perm(list,k+1,m);
             swap(list[i] , list[k]);
         }
     }
     
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值