整数串拆段

目录

正片开始

整篇代码


高精乘和除先放一放,我们先来讲一道模拟题

将一个长度小于10位的数字串拆成2段,使其和为最小的素数。
例如数字串‘13304’ 
拆的方法有: 
1 + 3304 = 3305 
13 + 304 = 317 
133 + 04 = 137 
1330 + 4 = 1334 
从上面可看出,和为素数的有:317 与137,最小的是137
输出最小的素数,若没有满足要求的数,输出-1

废话不多说,直接开始

学习之前你需要掌握:for循环,数组,字符串,函数,while循环,erase函数,

*min_element( , )函数

正片开始

其实,这只是一道简单的模拟题,为乘和除做铺垫

首先我们需要做一个判断质数的函数

bool F(int n){
	for(int i=2;i<n;i++){
		if(n%i==0) return false;
	}
	return true;
}

接下来的思想很重要:先将数字定义为字符串,输入,求长度,在每一个每一个的去拆,但是,我们还需要一个串转数的函数,如下

int C(string s){
	int ans=0;
	while(s!=""){
		ans=ans*10+(s[0]-'0');
		s.erase(0,1);
	}
	return ans;
}

重点来了,到底该怎么拆?

	l=s.size();
    for(i=0;i<l-1;i++){
		string s1="",s2="";	//前,后 
		for(int j=0;j<=i;j++) s1+=s[j];	//前面的 
		for(int j=i+1;j<=l-1;j++) s2+=s[j];	//后面的 
		int p=C(s1),q=C(s2);	//加 
		a[i]=p+q;	//导入 
		//cout<<p<<' '<<q<<endl;
		//cout<<a[i]<<endl;
	}

结合注释,你应该明白了,变量i是前部分的终点,也是后部分的起点,变量j作为每一位上的数字

s1表示前面一串的数字,s2表示后面的,p=串转数(s1),q=串转数(s2),a数组存储每一项的和

明白了吧,剩下的都是小儿科了

	for(i=0;i<l-1;i++){
		if(F(a[i])){
			b[bl]=a[i];bl++;	//判断素数,求b数组的长度 
			//cout<<b[bl];
		}
	}
	//cout<<bl<<endl;
	if(bl!=0)
		cout<<*min_element(b,b+bl);	//最小值 
	else cout<<"-1";	//没有 
    return 0;

整篇代码

//(water problem)
#include<bits/stdc++.h>
using namespace std;
const int mx=15;
string s;	//字符串方便 
int a[mx],b[mx],i;
int C(string s){	//串转数 
	int ans=0;
	while(s!=""){
		ans=ans*10+(s[0]-'0');
		s.erase(0,1);
	}
	return ans;
}
bool F(int n){	//素数 
	for(int i=2;i<n;i++){
		if(n%i==0) return false;
	}
	return true;
}
int main()
{
	ios::sync_with_stdio(false);	//优化 
	cin>>s;
	int l=s.size(),bl=0;
	for(i=0;i<l-1;i++){
		string s1="",s2="";	//前,后 
		for(int j=0;j<=i;j++) s1+=s[j];	//前面的 
		for(int j=i+1;j<=l-1;j++) s2+=s[j];	//后面的 
		int p=C(s1),q=C(s2);	//加 
		a[i]=p+q;	//导入 
		//cout<<p<<' '<<q<<endl;
		//cout<<a[i]<<endl;
	}
	for(i=0;i<l-1;i++){
		if(F(a[i])){
			b[bl]=a[i];bl++;	//判断素数,求b数组的长度 
			//cout<<b[bl];
		}
	}
	//cout<<bl<<endl;
	if(bl!=0)
		cout<<*min_element(b,b+bl);	//最小值 
	else cout<<"-1";	//没有 
    return 0;
}

谢谢观看 

posted @ 2022-09-17 16:58  Euouae  阅读(90)  评论(0编辑  收藏  举报