• 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 }

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

  • 相关阅读:
    剑指Offer
    剑指Offer
    ASP.NET MVC4中的bundles特性引发服务器拒绝访问(403错误)
    less文件的样式无法生效的一个原因,通过WEB浏览器访问服务器less文件地址返回404错误
    Sqlserver Sql Agent Job 只能同时有一个实例运行
    SSAS 聚合设计提升CUBE的查询性能(转载)
    SQL SERVER: 合并相关操作(Union,Except,Intersect)
    SQL Server安装完成后3个需要立即修改的配置选项(转载)
    收缩TempDB的办法(转载)
    SSIS 关于并发的两个设置
  • 原文地址:https://www.cnblogs.com/byzsxloli/p/5438752.html
Copyright © 2020-2023  润新知