1.字符串大数计算
除法
string Dive(string str,int n){
int remind=0;// 余数
for(int i=0;i<str.size();i++){
int temp=remind*10+str[i]-'0';
remind=temp%n;
str[i]=temp/n+'0';
}
int pos=0;
while(str[pos]=='0') // 去除多余的前置0
pos++;
return str.substr(pos);
}
乘法
string Multiple(string str,int n){
int carry=0;
for(int i=str.size()-1;i>=0;i--){// 从低位依次到高位,模拟手动计算的过程
int temp=(str[i]-'0')*n+carry;
carry=temp/10;// 进位
str[i]=temp%10+'0';
}
if(carry!=0){// 有进位
char temp=carry+'0';
str.insert(0,1,temp);
}
return str;
}
加法
string Add(string str,int n){
int carry=n;
for(int i=str.size()-1;i>=0;i--){// 从低位到高位,手动模拟加法
int temp=str[i]-'0'+carry;
carry=temp/10;
str[i]=temp%10+'0';
}
if(carry!=0){// 有进位
char temp=carry+'0';
str.insert(0,1,temp);
}
return str;
}
2. 全排序
使用next_permutation函数
next_permutation(arr, arr+size);
需要导入 #include <algorithm>;
参数说明:
arr: 数组名
size:数组元素个数
函数功能: 返回值为bool类型,当当前序列不存在下一个排列时,函数返回false,否则返回true,排列好的数在数组中存储
string s;
while (getline(cin, s)) {
sort(s.begin(), s.end());
do
{
cout << s << endl;
} while (next_permutation(s.begin(), s.end()));
cout << endl;
}
递归求解
1.无顺序要求,利用递归与交换:
原理:利用递归,不断进行交换
void Find(string& str,int start,int end){
if(start==end)// 到达最后一位时,输出结果
cout<<str<<endl;
for(int i=start;i<=end;i++){
swap(str[start],str[i]);
Find(str,start+1,end);
swap(str[start],str[i]);// 恢复原样
}
}
int main(){
string str;
cin>>str;
Find(str,0,str.size()-1);
}
2.有顺序要求,利用回溯法
原理:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
bool visited[10];
void Find(string str,string ans,int index)
{
if(index==str.size()){
cout<<ans<<endl;
return;
}
for(int i=0;i<str.size();i++){
if(visited[i])// 该位置已经被访问过
continue;
visited[i]=true;
ans.append(1,str[i]);// 加入字符串
Find(str,ans,index+1);
ans.erase(index);// 将其删去
visited[i]=false;
}
}
int main(){
string str;
cin>>str;
for(int i=0;i<str.size();i++)
visited[i]=false;
string ans="";
Find(str,ans,0);
}