zoukankan      html  css  js  c++  java
  • poj 1142

    题目:http://poj.org/problem?id=1142

    如果一个数本身是素数,那么这个数不是Smith Numbers,如果一个数不是素数,那么10 ^ 4( n 最多 8 位)以内一定有它的质因子,打出10000以内的素数,分解求和,从 n + 1往后枚举

    View Code
     1 const int  N = 10001;
     2 int prime[N];
     3 bool vis[N];
     4 int num,tnum;
     5 void is_prime()
     6 {
     7     int i,j;
     8     num = 0;
     9     for(i = 2; i <= N; i++)
    10     {
    11         if(!vis[i]) prime[num ++] = i;
    12         for(j = 2; j * i <= N; j++)
    13         {
    14             if(vis[j * i]) continue;
    15             vis[j * i] = true;
    16         }
    17     }
    18 }
    19 bool is_prim(int n)
    20 {
    21     int i;
    22     for(i = 2; i * i <= n; i++)
    23     {
    24         if(n % i == 0) return false;
    25     }
    26     return true;
    27 }
    28 int calsum(int n)
    29 {
    30     int tsum = 0;
    31     while(n)
    32     {
    33         tsum += (n % 10);
    34         n /= 10;
    35     }
    36     return tsum;
    37 }
    38 int cal(int n)
    39 {
    40     int i;
    41     int tsum = 0;
    42     for(i = 0; i < num; i++)
    43     {
    44         if(n == 1) break;
    45         while(n % prime[i] == 0)
    46         {
    47             int temp = prime[i];
    48             n /= prime[i];
    49             tsum += calsum(temp);
    50         }
    51     }
    52     if(n != 1) tsum += calsum(n);
    53     return tsum;
    54 }
    55 int main()
    56 {
    57     int i,j;
    58     is_prime();
    59     int n;
    60     while(scanf("%d",&n) != EOF)
    61     {
    62         if(!n) break;
    63         i = n + 1;
    64         while(1)
    65         {
    66             if(is_prim(i)) {i++; continue;}
    67             if(calsum(i) == cal(i)) break;
    68             i++;
    69         }
    70         cout<<i<<endl;
    71     }
    72     return 0;
    73 }

    题目:http://codeforces.com/problemset/problem/233/B

    被上面误导了一下,我看标签写的是二分,数学,然后就写二分,可是写好了发现不对呀,根本就不是单调函数怎么可以分出结果呢,然后开始想枚举x,但是发现太大了,但是s(x) 最大是81,于是就枚举 s(x),这样就形成一个 x ^ 2 +  b * x + (-n)  = 0 2次方程,然后根据求根公式 x = (-b +(-) sqrt(b * b - 4 * a * c)) / 2 * a;然后求出 x,然后再判断

    View Code
     1 typedef long long ll;
     2 ll cal(ll x)
     3 {
     4     ll temp = 0;
     5     while(x)
     6     {
     7         temp += (x % 10);
     8         x /= 10;
     9     }
    10     return temp;
    11 }
    12 int main()
    13 {
    14     ll n;
    15     int i,flag;
    16     while(cin>>n)
    17     {
    18         flag = 0;
    19         for(i = 1; i <= 100; i++)
    20         {
    21             ll m = (sqrt((i * i + 4 * n) * 1.0) - i) / 2;  
    22             ll ans = cal(m);
    23             if(cal(m) == i && m * m + i * m == n)
    24             {
    25                 cout<<m<<endl;flag = 1;break;
    26             }
    27         }
    28         if(!flag) printf("-1\n");
    29     }
    30     return 0;
    31 }
  • 相关阅读:
    eclipse lua
    eclipse新建python项Project interpreter not specified
    Laravel Debugbar
    Java中枚举类型简单学习
    SG函数题目
    关于解决博弈论问题的SG函数
    三种典型的博弈论问题
    Java I/O 对象序列化
    Java I/O 文件加锁,压缩
    Java I/O NIO学习
  • 原文地址:https://www.cnblogs.com/fxh19911107/p/2752997.html
Copyright © 2011-2022 走看看