字符串常见算法

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);
	
}

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值