题目给出你一个数分解成几个素数相乘的形式,
例如样例2:
5 1 2 1
10=5^1*2^1
然后要求你求出根据所给展开形式得到原数num,求num-1的展开形式
思路:
我先用筛数法把素数全部找出来,然后依次尝试,若找到最后一个素数因子都还没办法分解完,那么剩下的数就为素数,直接加到最后。需要注意的是用long long 保存
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=10000;
int pri[maxn],cnt;
bool ispri[maxn];
long long ansa[maxn],ansb[maxn],count;
void Init()
{
ispri[1]=1;
cnt=0;
for(int i=2;i<maxn;i++)
{
if(!ispri[i])
pri[cnt++]=i;
for(int j=2;i*j<maxn;j++)
ispri[i*j]=1;
}
}
long long QuickMul(int a,int b)
{
long long ans=1;
long long val=a;
while(b)
{
if(b&1)
ans*=val;
val*=val;
b>>=1;
}
return ans;
}
void GetAns(long long num)
{
count=0;
for(int i=0;i<cnt&&num>1;i++)
{
if(num%pri[i]==0)
{
ansa[count]=pri[i];
ansb[count]=0;
while(num>1&&num%pri[i]==0)
{
ansb[count]++;
num/=pri[i];
}
count++;
}
}
if(num>1)
{
ansa[count]=num;
ansb[count++]=1;
}
printf("%lld %lld",ansa[count-1],ansb[count-1]);
count--;
for(int i=count-1;i>=0;i--)
printf(" %lld %lld",ansa[i],ansb[i]);
printf("\n");
}
int main()
{
Init();
char ch;
while(scanf("%c",&ch)!=EOF)
{
if(ch=='0')
break;
int res=ch-'0',last=0;
long long num=1;
while(1)
{
scanf("%c",&ch);
if(ch=='\n')
{
num*=QuickMul(last,res);
break;
}
if(ch==' ')
{
if(!last)
{
last=res;
res=0;
}
else
{
num*=QuickMul(last,res);
res=last=0;
}
}
else
res=res*10+ch-'0';
}
GetAns(num-1);
}
return 0;
}