整数串拆段
目录
高精乘和除先放一放,我们先来讲一道模拟题
将一个长度小于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;
}
谢谢观看