码迷,mamicode.com
首页 > 其他好文 > 详细

一道推理题

时间:2014-06-19 10:28:18      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   code   http   tar   

题目:http://115.28.76.232/problem?pid=1115

 

题意:初始给定两个完美数13,如果bubuko.com,布布扣都是完美数,那么bubuko.com,布布扣也是完美数。现在给定一个数,判断

     它是否是完美数。

 

分析:嗯,这道题Mayuyu有两种方法,第一种方法是按照题意有bubuko.com,布布扣,那么我们进行递归直接判

     断。这样做的时间复杂度很高,通过打表对一些数的观察发现,只需要看这个数bubuko.com,布布扣是否只由35组成。

   

打表代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>

using namespace std;
typedef long long LL;

bool dfs(int n)
{
    if(n == 1 || n == 3)
        return true;
    if(n < 0) return false;
    int t = n + 2;
    int x = (int)sqrt(1.0*n + 2);
    for(int i=3; i<=x; i++)
    {
        if(t % i == 0)
        {
            int a = i;
            int b = t / a;
            return dfs(a - 2) && dfs(b - 2);
        }
    }
}

int main()
{
    int n;
    for(n=1;n<=10000;n++)
        if(dfs(n))
            cout<<n + 2<<endl;
    return 0;
}

 

当然还有一种方法就是直接推理做,已经知道bubuko.com,布布扣,如果有

 

      bubuko.com,布布扣

 

带入上式得到bubuko.com,布布扣,如果一直推下去得到很多个这样的数相乘,而最终都会转化为

若干个3和若干个5相乘的形式。

 

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        n += 2;
        while(n % 3 == 0) n /= 3;
        while(n % 5 == 0) n /= 5;
        if(n == 1) puts("Yes");
        else puts("No");
    }
    return 0;
}

 

 

 

一道推理题,布布扣,bubuko.com

一道推理题

标签:style   class   blog   code   http   tar   

原文地址:http://blog.csdn.net/achelloworld/article/details/30094683

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!