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("\n"); 130 } 131 132 int main() 133 { 134 getprime(); 135 //showprime(); 136 while(datecin()) 137 { 138 datecal(num); 139 showres(); 140 } 141 return 0; 142 }
关于输入,因为没有告诉你有多少个数字,用字符串输入转换比较好。