• 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
  • 相关阅读:
    [学习日记]进程、线程和模块
    [学习日记]对SOAP头内添加信息的验证,可实现对请求WEB服务进行身份验证。
    [梦里原创]关于猫和老鼠的问题(程序算法)
    [学习日记]对控件的继承和重载
    [学习日记]VB图像处理之像素的获取和输出
    猫和老鼠问题的讨论
    [音乐欣赏]丁香花
    推荐一个WINDOWS系统文件介绍的网站
    [转]查查在中国有多少人的名字和你一样!
    计算机语言发展图解
  • 原文地址:https://www.cnblogs.com/goldenretriever/p/10355831.html
Copyright © 2020-2023  润新知