HDU 1406.完数【筛选法以及特殊方法】【7月27】

完数

看来我的心还是不够细啊,这对一个ACMer来说,太致命了!

Problem Description

完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3;28=1+2+4+7+14。

本题的任务是判断两个正整数之间完数的个数。

Input

输入数据包含多行,第一行是一个正整数n,表示测试实例的个数,然后就是n个测试实例,每个实例占一行,由两个正整数num1和num2组成,(1<num1,num2<10000) 。

Output

对于每组测试数据,请输出num1和num2之间(包括num1和num2)存在的完数个数。

Sample Input

2
2 5
5 7

Sample Output

0
1

这个题,乍看简单!我wa了8次!!!!首先,根据完数定义,可以在输入的时候计算,同样可以跟上一篇博文中提到的筛选法一样,输入之前做好计算,输入后直接判断即可。还有一个细节,num1跟num2大小不一定!!!!这才是坑!代码如下:

#include<cstdio>
#include<iostream>
using namespace std;
int f[10010];
int main(){
    for(int i=0;i<10010;i++)
        f[i]=1;
    for(int i=2;i<5005;i++)
    for(int j=i+i;j<10010;j+=i)
        f[j]+=i;
    int n,num1,num2;
    while(scanf("%d",&n)!=EOF&&n)
        while(n--){
            int sum=0;
            scanf("%d%d",&num1,&num2);
            int minn=num1<num2?num1:num2;
            int maxn=num2>num1?num2:num1;
            for(int i=minn;i<=maxn;i++)
                if(f[i]==i) sum++;
            printf("%d\n",sum);
        }
    return 0;
}

然而,通过计算可以得知,10000之内的完数只有:6,28,496,8128!!!!!!ok,直接判断。。。只需判断4次。。。代码如下:

#include<cstdio>
#include<iostream>
using namespace std;
int f[4]={6,28,496,8128};
int main(){
    int n,num1,num2;
    while(scanf("%d",&n)!=EOF&&n)
        while(n--){
            int sum=0;
            scanf("%d%d",&num1,&num2);
            int minn=num1<num2?num1:num2;
            int maxn=num2>num1?num2:num1;
            for(int i=0;i<=4;i++)
                if(f[i]>=minn&&f[i]<=maxn) sum++;
            printf("%d\n",sum);
        }
    return 0;
}

还有一个算是小技巧吧,在上面的代码中没用:如果想交换两个数的值:

int a=1,b=2;
a^=b^=a^=b;//交换a,b的值。据说这是最短的代码~~是真的么

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-29 17:19:22

HDU 1406.完数【筛选法以及特殊方法】【7月27】的相关文章

hdu 1406 完数

Problem Description 完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3:28=1+2+4+7+14. 本题的任务是判断两个正整数之间完数的个数. Input 输入数据包含多行,第一行是一个正整数n,表示测试实例的个数,然后就是n个测试实例,每个实例占一行,由两个正整数num1和num2组成,(1<num1,num2<10000) . Output 对于每组测试数据,请输出num1和num2之间(包括num1和

HDU 1406 完数【打表】

/* 题目大意:求解给定两个数之间的完数的数目 解题思路:打一个求一个数所有因子之和的表. 关键点:找出一个数的所有因子,注意给定你两个数的大小关系 解题人:lingnichong 解题时间:2014-08-28 10:25:16 解题体会:注意题意啊 */ 完数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18355    Acc

HDOJ(HDU) 1406 完数

Problem Description 完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3:28=1+2+4+7+14. 本题的任务是判断两个正整数之间完数的个数. Input 输入数据包含多行,第一行是一个正整数n,表示测试实例的个数,然后就是n个测试实例,每个实例占一行,由两个正整数num1和num2组成,(1 import java.util.Scanner; public class Main{ public static

hdoj 1406 完数

完数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 23233    Accepted Submission(s): 8456 Problem Description 完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3:28=1+2+4+7+14. 本题的任务是判断两个正

HDOJ 1406 完数(打表,附讨论区出现的史上最牛逼打表,0ms)

 完数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22197    Accepted Submission(s): 8115 Problem Description 完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3:28=1+2+4+7+14. 本题的任务是判

【算法】普通方法和筛选法求素数

素数指的是因子只有1和本身的数(1不是素数),求解素数在数学上应用非常广泛,而求解n以内的素数也是我们编程时常遇到的问题,在这个问题上,筛选法求解素数运行得非常快.下面首先介绍如何判断一个是不是素数,然后介绍用普通方法求n以内的素数,接着是筛选法求n以内的素数,最后是两种算法的运行时间比较 判断一个数是不是素数 算法思想:判断小于等于一个数的平方的所有大于1的整数是不是能整除这个数,如果能,则表明这个数不是素数:反之,则是素数. //判断一个数是否为素数 bool isPlain(int val

hdu 5407 CRB and Candies(素数筛选法,除法取模(乘法逆元))

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5407 解题思路: 官方题解: The problem is just to calculate g(N) =\ LCM(C(N,0), C(N,1), ..., C(N, N))g(N) = LCM(C(N,0),C(N,1),...,C(N,N)). Introducing function f(n) =\ LCM(1, 2, ..., n)f(n) = LCM(1,2,...,n), the

HDU 1215.七夕节【筛选法】【7月26】

七夕节 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,而且和数字王国的人们说:"你们想知道你们的还有一半是谁吗?那就依照告示上的方法去找吧!" 人们纷纷来到告示前,都想知道谁才是自己的还有一半.告演示样例如以下: 数字N的因子就是全部比N小又能被N整除的全部正整数,如12的因子有1,2,3,4,6. 你想知道你的还有一半吗? Input 输入数据的第一行是一个数字T(1<=T<=500000),它表明測试数据的组数.然后是T组測试数据,每组測试数据仅仅有一个数字N(

HDU 1164 Eddy&#39;s research I【素数筛选法】

思路:将输入的这个数分成n个素数的相乘的结果,用一个数组存储起来.之后再输出就可以了 Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6633    Accepted Submission(s): 3971 Problem Description Eddy's interest is very ext