欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

class11 mfy 高精度+二分

时间:2024-06-29 20:10 作者:admin 点击:
高精度 加,减,乘,除 string 存储数据 倒序,保证个位对齐 计算,计算进位 结果:去除前导零,倒序 5-10 - 10-5=5 -5 string subll(string a,string b){ string ans=""; string sign=""; //判断两个字符串数

高精度 加,减,乘,除

string 存储数据

倒序,保证个位对齐

计算,计算进位

结果:去除前导零,倒序


5-10

- 10-5=5

-5


string subll(string a,string b){

   string ans="";

   string sign="";

   //判断两个字符串数字意义的大小

   if(a.size()<b.size()||a.size()==b.size()&&a<b){

       swap(a,b);

       sign="-";

   }

   reverse(a.begin(),a.end());

   reverse(b.begin(),b.end());

   int n1[1000]={},n2[1000]={},n3[1000]={};

   for(int i=0;i<a.size();i++) n1[i]=a[i]-'0';

   for(int i=0;i<b.size();i++) n2[i]=b[i]-48;

   int jw=0;

   for(int i=0;i<a.size();i++){

       int num=a[i]-b[i];

       if(num<0){

           a[i+1]--;

           num+=10;

       }

       n3[i]=num;

   }

   int k=999;

   while(n3[k]==0&&k!=0) k--;

   for(;k>=0;k--) ans=ans+(char)(n3[k]+'0');//ans=ans+to_string(n3[k]);

   return sign+ans;

}

string mulll(string a,string b){

   倒序,保证个位对齐

   ab存入数组n1,n2

   答案数组n3【长度=a.size()+b.size()】

   int jw=0;

   for(int i=0;i<a.size();i++){

       jw=0;

       for(int j=0;j<b.size();j++){

           n3[i+j]+=n2[j]*n1[i]+jw;

           jw=n3[i+j]/10;

           n3[i+j]/=10;

       }

       n3[i+b.size()]=jw;

   }

   n3[a.size()+b.size()]=jw;

   去除前导零,倒序返回结果

}

string divll(string a,int b){

   int aa[1000]={};

   for(int i=0;i<a.size();i++) aa[i]=a[i]-'0';

   int num[1000]={},ys=0;

   for(int i=0;i<a.size();i++){

       num[i]=(ys*10+aa[i])/b;

       ys=aa[i]%b;

   }

   //求余数: return ys;

   //求商:去除前导零,不倒序拼接结果

}


分治算法(二分法,快速排序,归并排序)

二分法:二分查找,二分答案

使用二分法的前提:答案范围一定是有序的


猜数字游戏

系统生成一个随机数

人猜这个数字是多少

猜对了,提示正确

猜错了,提示猜大了或猜小了

根据提示重新猜


int x=rand()%100+1;//自动生成一个1-100之间的随机数

范围:1-100 有序

1、找左右端点

int l=1,r=100;

while(l<r){

   int mid=(l+r)/2;

   if(mid>x) r=mid-1;

   else if(mid<x)l=mid+1;

   else {

       cout<<mid;

       break;

   }

}


二分查找模板:

int l=xx,r=xx;

while(l<r){

   int mid=(l+r)/2;

   if(mid大了) r=mid-1;

   else if(mid小了) l=mid+1;

   else {

       mid是答案

   }

}


二分答案模板:

bool pd(int mid){

   //根据题目要求

   return true/false;

}

//在对的里面找大的

int l=xx,r=xx;

while(l<=r){

   int mid=(l+r)/2;

   if(pd(mid))l=mid;

   else r=mid-1;

}

//在错的里面找最小的

int l=xx,r=xx;

while(l<=r){

   int mid=(l+r)/2;

   if(pd(mid))l=mid+1;

   else r=mid;

}

//1247河中跳房子

(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%