链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
讨伐魔王的路上总是充满阻碍,作为魔王的下属,为了更好的辅佐魔王,史莱姆里曼想知道自己分裂能力的最大分裂数量,已知里曼的生命值为nnn,里曼每次分裂可以变成两个生命值分别为aaa,bbb的自己,aaa,bbb均不为1的正整数且满足a×b=na \times b=na×b=n,分裂后的史莱姆可以继续分裂,求经过最多次分裂后史莱姆的数量。
输入描述:
第一行:一个整数nnn。 数据满足:1≤n≤957181 \le n \le 957181≤n≤95718.
输出描述:
共一行:一个数字,表示里曼的最多分裂数量。
示例1
输入
复制4
4
输出
复制2
2
//代码ac了的
#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
int digui(int a,int b);
void sushai(bool w[],int n);
int count=0;
bool w[95719];
int main(void)
{
int flag=0;
int a,b;
int n;
scanf("%d",&n);
for(int i=2;i<=sqrt(n);++i)
{
if(n%i==0)
{
count=2;
a=n/i;
b=i;
flag=1;
break;
}
}
//printf("%d %d\n",a,b);
if(flag==0)
printf("1\n");
else
{
sushai(w,n);
//printf("%d %d\n",w[a],w[b]);
digui(a,b);
printf("%d\n",count);
}
return 0;
}
void sushai(bool w[],int n)
{
for(int i=0;i<=n;++i)
w[i]=1;
for(int i=2;i<=sqrt(n);++i)
{
for(int j=2;i*j<=n;++j)
w[i*j]=0;
}
}
int digui(int a,int b)
{
if(w[a]==1&&w[b]==1)
return 0;
else
{
//printf("df");
for(int i=2;i<=sqrt(a);++i)
{
if(a%i==0)
{
a/=i;
// printf("%d\n",a);
++count;
break;
}
}
for(int i=2;i<=sqrt(b);++i)
{
if(b%i==0)
{
b/=i;
++count;
break;
}
}
//printf("%d\n",count);
return digui(a,b);
}
}
//总的来说就是在递归中想记录递归的次数,定义一个全局变量count=0,然后每进行一次就可以++count,此题是道求质因数的题,就是我的写法一般就是比较特殊,我先去素筛求质数,然后分裂到这些数就可以,跳出递归,整体的思想就是这样