这个题用到了题目的知识点,记录一下吧。
假设s和m初始化,s = "a"; m = s;
再定义两种操作,第一种操作:
m = s;
s = s + s;
第二种操作:
s = s + m;
求最小的操作步骤数,可以将s拼接到长度等于n
思路:
思路:
实际上求的是m取得最大值最少需要几步
因为s一定是m的倍数
当n为质数,则只能通过步骤二来凑n
当n不是质数,将其拆分成各个质数,然后步骤就是每个质数的实现步骤
将n拆分成各个质数因子的实现伪代码
void minStep(int n){
for(int i=2; i<=n; i++){
while(n%i==0){
此时的i就是n的一个质数因子了
n/=i;
}
}
}
整个题解:
/*
假设s和m初始化,s = "a"; m = s;
再定义两种操作,第一种操作:
m = s;
s = s + s;
第二种操作:
s = s + m;
求最小的操作步骤数,可以将s拼接到长度等于n
思路:
实际上求的是m取得最大值最少需要几步
因为s一定是m的倍数
当n为质数,则只能通过步骤二来凑n
当n不是质数,将其拆分成各个质数,然后步骤就是每个质数的实现步骤
*/
#include<iostream>
#include<math.h>
using namespace std;
int CreateNum(){
return rand();
}
//判断一个数是不是质数
bool judge(int n){
for(int i=2;i<=sqrt(n);i++){
if(!n%i) return true;
}
return false;
}
void minStep(int n){
cout<<"n的值为:"<<n<<endl;
if(n<2) return;
//判断n是不是质数
bool zhishu=judge(n);
if(zhishu){
cout<<n-1<<endl;
return;
}
//不是质数,此时需要获取质数的累加和以及质数的个数
//f(n)=f(a*b*c*d)=a-1+b-1+c-1+d-1
int sum=0, num=0;
for(int i=2; i<=n; i++){
//n的值会一直变小,当i=n时,说明这个n的各个质数因子被拆分完毕
while(n%i==0){
sum+=i;
num++;
n/=i;
}
}
cout<<"最少次数为:"<<sum-num<<endl;
}
int main(){
int time=10, n=0;
while(time--){
n=CreateNum();
minStep(n);
}
return 0;
}