zoukankan      html  css  js  c++  java
  • HDU1215

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1215

    由于此题的测试数据可能有500000个,就想到用预处理法把结果都算出来存到数组中,然而将会超时,可能原因是其测试数据没有500000组,所以不一定都得用预处理法处理

    。用筛选法处理也会超时。因此可以考虑直接求解,其中一定要先开根号得出结果,在带入循环条件,否则会超时。

    预处理代码:超时

    #include<iostream>
    using namespace std;
    #include<time.h>
    #include<math.h>
    int a[500005]={0};
    void solve()
    {
        double m;
        for(int j=2;j<=500000;j++)
        {
            m=(int)(sqrt(j*1.0));
            for(int i=2;i<=m;i++)
            {
                if(j%i==0)
                {
                    if(i*i!=j)
                a[j]=a[j]+i+j/i;
                else
                a[j]+=i;
                }        
            }
            a[j]+=1;
        }
    }
    int main()
    {
        int t,n;
        //freopen("d:\\1.txt","r",stdin);
        solve();
        cin>>t;
        while(t--)
        {
            cin>>n;
            cout<<a[n]<<endl;
        }
        //printf("%.2lf\n",(double)clock()/CLOCKS_PER_SEC);
        return 0;
    }

    筛选法,超时:

    #include<iostream>
    using namespace std;
    #include<math.h>
    int a[500005];
    int solve(int n)
    {
        int i,k,m,s=0;
        memset(a,0,sizeof(a));
            m=(int)(sqrt(n*1.0));
            for(i=1;i<=m;i++)
            {
                if(n%i!=0)
                for(k=i;k<=m;k+=i)
                a[k]=1;
            }
            for(i=2;i<=m;i++)
             if(a[i]==0)
             {
                 if(i*i!=n)
                 s+=(i+n/i);
                 else
                 s+=i;
             }
             return s+1;
    }
    int main()
    {
        freopen("d:\\1.txt","r",stdin);
        int t,n;
        cin>>t;
        while(t--)
        {
            cin>>n;
            if(n==1) cout<<0<<endl;
            else
            cout<<solve(n)<<endl;
        }
        return 0;
    }

    方法看一下代码就懂了,AC代码:

    #include<iostream>
    using namespace std;
    #include<math.h>
    int main()
    {
        //freopen("d:\\1.txt","r",stdin);
        int t,n,m;
        scanf("%d",&t);
        while(t--)
        {
            cin>>n;
            m=(int)(sqrt(n*1.0));
            int s=0;
            for(int i=2;i<=m;i++)
             {
                 if(n%i==0)
                 {
                  if(i*i!=n)
                  s=s+i+n/i;              
                  else
                  s+=i;
                  
                 }
             }
             cout<<(s+1)<<endl;
        }
        return 0;
    }
  • 相关阅读:
    git简单使用
    简单Spring和mybatis整合配置文件
    ASP.NET程序开发范例宝典
    C# DataSet和DataTable详解
    AOP
    匿名内部类
    数据库事务
    mybatis
    线程池
    单例模式
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2480543.html
Copyright © 2011-2022 走看看