标签:poj
The sequence 17 1 5 1 2 1 509 1 59 1 0
2 4 3 2 13 1 11 1 7 1 5 1 3 1 2 1
题目大意(质因数分解+素数打表):给出n的质因数分解式,求n-1的质因数的分解式。比如第二组sample,就是5^1*2^1=10, 求10-1即9的质因数分解,从大到小输出。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn = 100002;
bool isPrime[maxn];
int total,prime[maxn];
int path[maxn];//底
int po[maxn];//指数
int cnt;//用到了多少个质因数
void dabiao(){//欧拉筛选法产生素数表
total=0;
memset(isPrime,true,sizeof(isPrime));
for(int i=2;i<=maxn;i++){
if(isPrime[i]){
prime[total++]=i;
}
for(int j=0;j<=total;j++){
if(i*prime[j]>maxn) break;
isPrime[i*prime[j]]=false;
if(i%prime[j] == 0) break;
}
}
}
void solve(int n){//对n进行质因数分解
cnt=0;
for(int i=0;prime[i]<=n&&n!=1;i++){
int ct=0;
while(n%prime[i]==0){
ct++;
n/=prime[i];
}
if(ct!=0){
path[cnt] = prime[i];
po[cnt++] = ct;
}
}
for(int i=cnt-1;i>=0;i--){//输出分解完的式子
if(i!=0)printf("%d %d ",path[i],po[i]);
else printf("%d %d\n",path[i],po[i]);
}
}
int main(){
dabiao();
int a,b,num;
char ch;
while(~scanf("%d",&a)&&a){//注意这种格式输入的处理
scanf("%d%c",&b,&ch);
num=1;
num*=(int)pow(a*1.0,b*1.0);
while(ch!='\n'){
scanf("%d%d%c",&a,&b,&ch);
num*=pow(a+0.0,b);//这里一定要写成这个形式,不知道为什么,求解答
}
solve(num-1);
}
return 0;
}
标签:poj
原文地址:http://blog.csdn.net/hush_lei/article/details/41950749