POJ 1142 质因数分解

只要很朴素的分解就可以了,数据量不大

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <math.h>

#include <iostream>

#include <stack>

#include <algorithm>



#define ll long long

using namespace std;

const int INF = 0x3f3f3f3f;

const int MAXSIZE = 10100000;

ll n;

stack <int> s;



void init_prim(){

    memset(visit, true, sizeof(visit));

    int num = 0;

    for (int i = 2; i <= nn; ++i){

        if (visit[i] == true){

            num++;

            prime[num] = i;

        }

        for (int j = 1; ((j <= num) && (i * prime[j] <= nn));  ++j){

            visit[i * prime[j]] = false;

            if (i % prime[j] == 0) break; //点睛之笔

        }

    }

}



ll quickpow(ll m,ll n,ll k){

    int b = 1;

    while (n > 0){

          if (n & 1)

             b = (b*m)%k;

          n = n >> 1 ;

          m = (m*m)%k;

    }

    return b;

}



ll getsum(int x){

    int sum = 0;

    while(x){

        sum += x % 10;

        x = x / 10;

    }

    return sum;

}



bool witness(ll a,ll n){

    ll t,d,x;

    d = 1;

    int i=ceil(log(n-1.0)/log(2.0)) - 1;//j

    for(;i>=0;i--)

    {

        x=d;  d=(d*d)%n;

        if(d==1 && x!=1 && x!=n-1) return true;

        if( ((n-1) & (1<<i)) > 0)

            d=(d*a)%n;

    }

    return d==1? false : true;

}

bool miller_rabin(ll n){

    int s[]={2,7,61};

    if(n==2 || n == 1)    return true;

    if(n==1 || ((n&1)==0))    return false;

    for(int i=0;i<3;i++)// 3

        if(witness(s[i], n))    return false;

    return true;

}



bool isPrime(ll n){

    if(n == 1 || n == 2 || n == 3 || n == 5) return true;

    else if(n % 2 == 0 || n % 3 == 0 || n % 5 == 0)  return false;

    for(int i = 2; i <= sqrt(n); ++i){

        if(n % i == 0) return false;

    }

    return true;

}



bool judge(ll x){

    int sum1, sum2 = 0, i;

    sum1 = getsum(x);

    for(i = 2; i <= sqrt(x); ++i){

        if(x % i == 0){

            s.push(i);

            x = x / i;

            while(x % i == 0){

                s.push(i);

                x = x / i;

            }

        }

        if(x == 1)

            break;

    }

    if(x > 1) s.push(x);

    while(!s.empty()){

        sum2 += getsum(s.top());

        s.pop();

    }

    if(sum1==sum2) return true;

    else return false;

}

int main(){

    int i, j, k;

    while(cin >> n){

        if(n <= 0)  break;

        ll num = n;

        while(1){

            ++num;

            if(isPrime(num))    continue;

            else if(judge(num)){

                cout << num << endl;

                break;

            }

        }

    }

    return 0;

}

 

你可能感兴趣的:(poj)