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 }
原文地址:https://www.cnblogs.com/fxh19911107/p/2752997.html