UVA, 516 Prime Land

题意:给一个数的指数形式,例:5 1 2 1  num=5^1*2^1  求num-1的质因数分解结果

思路:素数筛法,质因数分解

代码如下:

  1 #include <iostream>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <cstdio>
  5 #include <cstdlib>
  6 #include <cmath>
  7 
  8 using namespace std;
  9 
 10 const int N=1000000;
 11 int cnt,tot;
 12 long num;
 13 long prime[N];
 14 bool isprime[N];
 15 string ss;
 16 int a[N],b[N];
 17 
 18 void getprime();
 19 void showprime();
 20 void getnum();
 21 bool datecin();
 22 void datecal(long);
 23 void showres();
 24 
 25 
 26 void getprime()
 27 {
 28     memset(isprime,1,sizeof(isprime));
 29     isprime[0]=isprime[1]=cnt=0;
 30     for(int i=2;i<N;i++)
 31     {
 32         if(isprime[i])
 33             prime[cnt++]=i;
 34         for(int j=0;j<cnt&&i*prime[j]<N;j++)
 35         {
 36             isprime[i*prime[j]]=0;
 37             if(!(i%prime[j]))break;
 38         }
 39     }
 40 }
 41 
 42 void showprime()
 43 {
 44     cout<<cnt<<endl;
 45     for(int i=0;i<cnt;i++)
 46         cout<<prime[i]<<' ';
 47     cout<<endl;
 48 }
 49 
 50 bool datecin()
 51 {
 52     getline(cin,ss);
 53     if((ss[0]=='0'))
 54     {
 55         return false;
 56     }
 57     getnum();
 58     return true;
 59 }
 60 
 61 void getnum()//得到num
 62 {
 63     int l=ss.length();//cout<<l<<endl;
 64     int k=1;
 65     double a,b,sum=1;
 66     for(int i=0;i<l;i++)
 67     {
 68         if(i==0)
 69         {
 70             a=atoi(ss.c_str());
 71         }
 72         else if(ss[i]==' ')
 73         {
 74             i++,k++;
 75             string s=ss.substr(i);
 76             int n=atoi(s.c_str());
 77             if(k==1)
 78             {
 79                 a=n;
 80             }
 81             else if(k==2)
 82             {
 83                 b=n;
 84                 sum*=pow(a,b);
 85                 k=0;
 86                 num=(long)sum;
 87                 //cout<<num<<endl;
 88             }
 89             //cout<<n<<endl;
 90         }
 91     }
 92     num--;
 93     //cout<<num<<endl;
 94 }
 95 
 96 void datecal(long num)
 97 {
 98     double temp=sqrt(num)+1;
 99     tot=0;
100     //cout<<'?'<<endl;
101     for(int i=0;temp>prime[i];i++)
102     {
103         if(num%prime[i]==0)
104         {
105             a[++tot]=prime[i];
106             b[tot]=0;
107             while(num%prime[i]==0)
108             {
109                 ++b[tot];
110                 num/=prime[i];
111             }
112         }
113     }
114     if(num!=1)
115     {
116         a[++tot]=num;
117         b[tot]=1;
118     }
119 }
120 
121 void showres()
122 {
123     for(int i=tot;i>=1;i--)
124     {
125         printf("%d %d",a[i],b[i]);
126         if(i!=1)
127             printf(" ");
128     }
129     printf("
");
130 }
131 
132 int main()
133 {
134     getprime();
135     //showprime();
136     while(datecin())
137     {
138         datecal(num);
139         showres();
140     }
141     return 0;
142 }

关于输入,因为没有告诉你有多少个数字,用字符串输入转换比较好。

原文地址:https://www.cnblogs.com/byzsxloli/p/5438752.html