- gcd
int gcd(int a,int b){ return b ? gcd(b,a%b) : a; } //lcm(a,b)=a*b/gcd(a,b);
//直接使用
__gcd(a,b); - 快速幂
- a为整型
int pow_mod(int a, int n, int m) { long long ans = 1; while(n){ if(n&1){ ans = (ans * a) % m; } a = (a * a) % m; n >>= 1; } return ans; }
2.改进版本,a为字符串
string pow_mod(string a,int n) { string ans="1"; while(n){ if(n&1){ ans=multiplication(ans,a); } a=multiplication(a,a); n>>=1; } return ans; }
- 进制转换
一般其他进制为 字符串,十进制为 整型
3.1 十进制 转 其他进制
思路:
把要转换的数,除以2(或其他),得到商和余数,将商继续除以2(或其他),直到商为0。最后将所有余数倒序排列,得到数就是转换结果。
or 使用C++自带函数 _itoa(n,str,b); //b为进制
#include<bits/stdc++.h> using namespace std; string itoA(int num,int radix){ string ans=""; do{ int t=num%radix; if(t>=0&&t<=9) ans+=t+'0'; else ans+=t-10+'A'; num/=radix; }while(num!=0); reverse(ans.begin(),ans.end());//字符串反转 return ans; } int main(){ int n,b; cin>>n>>b; string str; str=itoA(n,b); cout<<str<<endl; return 0; }
3.2 其他进制 转 十进制
思路:
ans=0, 把要转换的字符串从1-->n ,ans 乘以2 (或其他),加上 str [ i ](相当于反着来一遍)
int Atoi(string s,int n){//n进制转10进制 int ans=0; for(int i=0;i<s.size();i++){ char t=s[i]; if(t>='0'&&t<='9')ans=ans*n+t-'0'; else ans=ans*n+t-'a'+10; } return ans; }
or strtol函数
3.3
除了上面两个,c++中还有一些定向的转换:std::bitset(转2进制),std::oct(转8进制),std::dec (转10进制),std::hex(转16进制)。
更多详细参考:https://blog.csdn.net/lady_killer9/article/details/87904318
4.排序
4.1 快速排序
sort 解决
or 手写
//快速排序 void Quicksort(int array[],int left,int right){ if(left<right){ int i=left,j=right,pivot=array[left]; while(i<j){ while(i<j&&array[j]>=pivot)j--; if(i<j)array[i++]=array[j]; while(i<j&&array[i]<=pivot)i++; if(i<j)array[j--]=array[i]; } array[i]=pivot; Quicksort(array,left,i-1); Quicksort(array,i+1,right); } }
4.2 归并排序
#include<iostream> #include<algorithm> using namespace std; void mergearray(int aa[],int left,int mid,int right,int temp[]){ int i=left,j=mid+1; int x=mid,y=right; int k=0; while(i<=x&&j<=y){ if(aa[i]<=aa[j])temp[k++]=aa[i++]; else temp[k++]=aa[j++]; } while(i<=x)temp[k++]=aa[i++]; while(j<=y)temp[k++]=aa[j++]; for(int i=0;i<k;i++){ aa[left+i]=temp[i]; } } void mergesort(int aa[],int left,int right,int temp[]){ if(left<right){ int mid=(left+right)/2; mergesort(aa,left,mid,temp); mergesort(aa,mid+1,right,temp); mergearray(aa,left,mid,right,temp); } } int main(){ int a[100],b[100]; int n; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; mergesort(a,0,n-1,b); for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; return 0; }
完成,还剩高精度没看,等会看吧。