zoukankan      html  css  js  c++  java
  • 4C

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



    数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6. 
    你想知道你的另一半吗? 

    Input

    输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000). 

    Output

    对于每组测试数据,请输出一个代表输入数据N的另一半的编号. 

    Sample Input

    3
    2
    10
    20

    Sample Output

    1
    8
    22

    // 注意T和N的取值范围,直接遍历求因子和计算量过大
     1 #include<stdio.h>
     2 int main()
     3 {
     4     int t, n, sum, i;
     5     scanf("%d", &t);
     6     while(t--)
     7     {
     8         scanf("%d", &n);
     9         sum=0;
    10         for(i=1;i<n;i++)
    11             if(n%i==0)
    12                 sum+=i;
    13         printf("%d
    ", sum);
    14     }
    15     return 0;
    16 }
    Time Limit Exceeded
    // 取一半遍历还是太大
     1 #include<stdio.h>
     2 int main()
     3 {
     4     int t, n, sum, i;
     5     scanf("%d", &t);
     6     while(t--)
     7     {
     8         scanf("%d", &n);
     9         sum=1;
    10         for(i=2;i<=n/2;i++)
    11             if(n%i==0)
    12                 sum+=i;
    13         printf("%d
    ", sum);
    14     }
    15     return 0;
    16 }
    Time Limit Exceeded*2
    // 用了打表,但是求因子和的算法未变
     1 #include<stdio.h>
     2 int soulm[500001];
     3 int main()
     4 {
     5     for(int j=1;j<=500000;j++)
     6     {
     7         int sum=1;
     8         for(int i=2;i<=j/2;i++) if(j%i==0) sum+=i;
     9         soulm[j]=sum;
    10     }
    11     int t, n;
    12     scanf("%d", &t);
    13     while(t--)
    14     {
    15         scanf("%d", &n);
    16         printf("%d
    ", soulm[n]);
    17     }
    18     return 0;
    19 }
    Time Limit Exceeded*3
    // i和j表示因子,其中j又代表不超过N的正整数.
    // 减少了调用因子的次数,用循环控制积
    // 注意表中的和包含了N,输出时要减去
     1 #include<stdio.h>
     2 int soulm[500001];
     3 int main()
     4 {
     5     for(int j=1;j<=500000;j++)
     6         for(int i=1;i*j<=500000;i++)
     7             soulm[i*j]+=i;
     8     int t, n;
     9     scanf("%d", &t);
    10     while(t--)
    11     {
    12         scanf("%d", &n);
    13         printf("%d
    ", soulm[n]-n);
    14     }
    15     return 0;
    16 }
    AC
  • 相关阅读:
    EasyTransaction主要源码分析
    编程哲理小故事:Tina的运动会方阵
    多维扩展点的思考与设计——解决渠道、产品增加引发的腐化问题
    分布式事务框架Seata及EasyTransaction架构的比对思考
    设计,架构,框架之间是什么关系?
    你知道如何画好一幅架构图么?
    学会分享痛苦
    建立你自己的博客
    使用正确的工具软件
    掌握主动权
  • 原文地址:https://www.cnblogs.com/goldenretriever/p/10355831.html
Copyright © 2011-2022 走看看