HUD 1215七夕节(get一种解决超时的新思想)

来源:互联网 发布:移动网络维护人员体检 编辑:程序博客网 时间:2024/06/10 04:31

做完这道题后才发现自己是真的菜, 这个题是真的皮。这道题还是大一上学期的时候打杭电单身节比赛的时候遇见的,因为一直找不到合适的、能够使其不超时的方法,而且也忘记了这道题,才一直保留了下来。今天在做这道题的时候,第一眼用打表法,但是因为这道题的数字量级为五十万级,所以一般的找因子的方法会超时,所以我还是无法解决这道题超时的问题。直到我看了他们的博客我才找到解决超时的方法。

内心对我这种行为真的很不屑,但是确实胸中没有解决这种情况的墨水,所以还是继续积累吧!

方法就是:先用个变量 i 循环遍历从1到maxnum,在这个循环内再另开一个循环,以 i 为基础遍历maxnum内的所有 i 的倍数,使对应的数加 i 。

我现在从中体会到,其精髓是:由因子找倍数

1、单位变化的数字为 i ,不需要以一为单位一个一个的找了,这就节省了相当大的一段时间。

2、原始方法,一个一个的找因子,会使具有相同因子的数字在找时步骤重复,且多了很多判断。

七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" 
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下: 



数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6. 
你想知道你的另一半吗? 
Input
输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000). 
Output
对于每组测试数据,请输出一个代表输入数据N的另一半的编号. 
Sample Input
321020
Sample Output
1822


时间成本大的原始找因子代码:

#include <iostream>#include <algorithm>#include <cstdio>#include <map>#include <cstring>using namespace std;const int maxn = 20000;int data[maxn + 5];int found(int num){    int sum = 0;    for(int i = 1; i < num; i++)    {        if(num % i == 0)        {            sum += i;        }    }    return sum;}void txt(){    for(int i = 1; i <= maxn; i++)    {        data[i] = found(i);    }}int main(){    txt();    int t;    scanf("%d", &t);    while(t--)    {        int num;        scanf("%d", &num);        printf("%d\n", data[num]);    }    return 0;}
新的因子找倍数法:

#include <iostream>#include <algorithm>#include <cstdio>#include <map>#include <cstring>using namespace std;const int maxn = 20000;int data[maxn + 5];int found(int num){    int sum = 0;    for(int i = 1; i < num; i++)    {        if(num % i == 0)        {            sum += i;        }    }    return sum;}void txt(){    for(int i = 1; i <= maxn; i++)    {        data[i] = found(i);    }}int main(){    txt();    int t;    scanf("%d", &t);    while(t--)    {        int num;        scanf("%d", &num);        printf("%d\n", data[num]);    }    return 0;}



原创粉丝点击