• #Z0045. S数



    一道很简单的模拟题,不知为何却足足做了将近2周。。。


    一,TLE解法

    1. #include
    2. using namespace std;
    3. int f(int n)//返回n的所有数位相加之和
    4. {
    5. int sum = 0;
    6. while(n > 0)
    7. {
    8. sum += n % 10;
    9. n /= 10;
    10. }
    11. return sum;
    12. }
    13. bool s(int n)//如果n是S数,返回1,不是返回0
    14. {
    15. int ttt = n / 2,sn = f(n),st = 0;
    16. //st:n的所有数位相加之和 sn:n的分解质因数后所有数位之和
    17. for(int i = 2; i <= ttt; i++)//分解质因数
    18. {
    19. if(n % i == 0)
    20. {
    21. int fs = 0;//fs记录n最多能被多少个i除
    22. while(n % i == 0) n /= i,fs++;
    23. st += f(i) * fs;
    24. }
    25. }
    26. if(sn == st) return 1;//如果n的所有数位相加之和==n的分解质因数后所有数位之和,返回1
    27. else return 0;
    28. }
    29. int main()
    30. {
    31. int n;
    32. while(~scanf("%d",&n))
    33. {
    34. if(n == 0) break;
    35. for(int i = n + 1; i; i++)//枚举>n的数
    36. {
    37. if(s(i))//判断是否是S数
    38. {
    39. printf("%d\n",i);
    40. break;
    41. }
    42. }
    43. }
    44. return 0;
    45. }

    超时原因:分解质因数太慢了!此程序中分解质因数·时间复杂度为O(2*n)


    二,AC解法

    1. #include
    2. using namespace std;
    3. int f(int n)
    4. {
    5. int sum = 0;
    6. while(n > 0)
    7. {
    8. sum += n % 10;
    9. n /= 10;
    10. }
    11. return sum;
    12. }
    13. bool s(int n)
    14. {
    15. int sn = f(n),st = 0;
    16. for(int i = 2; i <= n / i; i++)//原来要枚举n/2次,现在只需枚举sqrt(n)次即可
    17. {
    18. int fs = 0;
    19. while(n % i == 0) n /= i,fs++;
    20. st += f(i) * fs;
    21. }
    22. if(n > 1) st += f(n);//如果最后n仍没分解完,就直接把它看作质因数中的一个,有一次WA就是因为这一点
    23. if(sn == st) return 1;
    24. else return 0;
    25. }
    26. bool pri(int n)
    27. {
    28. if(n < 2) return 0;
    29. if(n == 2) return 1;
    30. for(int i = 2; i <= n / i; i++)
    31. if(n % i == 0)
    32. return 0;
    33. return 1;
    34. }
    35. int main()
    36. {
    37. int n;
    38. while(~scanf("%d",&n))
    39. {
    40. if(n == 0) break;
    41. for(int i = n + 1; i; i++)
    42. {
    43. if(pri(i)) continue;
    44. //优化,因为题目中说了S数不包括质数,因为质数是没有办法分解的。有一次提交WA就是因为没加这一点
    45. if(s(i))
    46. {
    47. printf("%d\n",i);
    48. break;
    49. }
    50. }
    51. }
    52. return 0;
    53. }

    此程序中分解质因数·时间复杂度为O(sqrt(n)) 

  • 相关阅读:
    ubuntu-server部署hive-part2-安装hadoop
    夜天之书 #60 面向人力资源的 GitHub 指南
    RedissonCach的源码流程
    ZCU102启动镜像(详细版)
    部署elasticsearch集群
    力扣:152. 乘积最大子数组(Python3)
    kubernetes的多租户管理实践
    基于N32G45的按键驱动
    [E::hts_idx_push] Unsorted positions on sequence tbx_index_build failed:
    Chrome清除Cookie未生效
  • 原文地址:https://blog.csdn.net/weq2011/article/details/128113654