高精度 加,减,乘,除 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) |