晚饭后朋友发来个问题,正好无事做,动手写了一下

若一个正整数有偶数个不同的真因子,则称该数为幸运数。如4含有2个真因子为 1 和 2 。故4是幸运数。求【2,100】之间的全部幸运数之和。

常规思路

被除数一直除以 1 2 3 ... 直到除以它自身,不过这种比较消耗资源(周知python简洁但效率不高)

getf.py

  1. def get_Factor(x):
  2. """
  3. n 需要求真因数的数(被除数) x
  4. x 除数 y
  5. rem 余数
  6. quo 商
  7. """
  8. if x == 0: return [0]
  9. if x == 1: return [1]
  10. f_list = []
  11. for y in range(1,x):#定义y是除数
  12. rem = x % y
  13. quo = x // y
  14. if rem == 0:# 如果x可以被y整除
  15. if y not in f_list:
  16. f_list.append(y)
  17. if quo not in f_list:
  18. f_list.append(quo)
  19. continue
  20. continue
  21. continue
  22.  
  23. f_list.sort(reverse = False)
  24. f_list.pop()
  25. #是一个一个加进去,排个序后删除本身
  26. return x , f_list
  27.  
  28. def get_Luckynum(a, b):
  29. Luckynum = []
  30. for i in range(a,b+1):
  31. i,f_list = get_Factor(i)
  32. if len(f_list) % 2 == 0:
  33. Luckynum.append(i)
  34. # print(i,"的真因数:",f_list,"个数为",len(f_list),"个,■■是■■")
  35. # else:
  36. # print(i,"的真因数为:",f_list,"个数为",len(f_list),"个,♦♦不是♦♦")
  37.  
  38. return Luckynum, sum(Luckynum)

main.py

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri Apr 19 19:32:33 2019
  4.  
  5. @author: Administrator
  6. """
  7. import getf
  8.  
  9. a = int(input("请输入最小值:"))
  10. b = int(input("请输入最大值:"))
  11. Luckynum, sum_Luckynum = getf.get_Luckynum(a,b)
  12. print('区间 [{0},{1}] 的幸运数包含:{2}'.format(a, b, Luckynum))
  13. print('它们的总和是:{0}'.format(sum_Luckynum))

另一个思路:被除数区间的定义

稍微思考一下

a*b = c   a变大b就会变小   a变小b就会变大

假设a永远是最小 b永远是最大的哪个

那么 a 和 b 的它们最大值,肯定是 √c

该思路就是让 c 求商的时候,不用像常规思路一般一直除到本身(如65,要除以1..2..3..4......65 )资源消耗大,效率低下

而是一直除到 √c  (如65,要除以1..2..3..4...一直到√65  就停止遍历)

当然 遍历到 √c 的时候 a = b 这个就在加个判断就好了,不允许重复

如下

  1. import math
  2.  
  3. def new_get_Factor(x):
  4. if x == 0: return [0]
  5. if x == 1: return [1]
  6. f_list = []
  7. for y in range(1,int(math.sqrt(x)) + 1):
  8. #(1,根号x+1)确保能够遍历到根号x
  9. rem = x % y
  10. quo = x // y
  11. if rem == 0:
  12. f_list.append(y)
  13. if y != quo:
  14. f_list.append(quo)
  15. continue
  16. continue
  17.  
  18. f_list.sort(reverse = False)
  19. f_list.pop()
  20. return x,f_list

Python 计算当真因子个数为偶数个时为幸运数,计算区间内幸运数之和的更多相关文章

  1. SPOJ DQUERY 求区间内不同数的个数 主席树

    这题跟HDU3333差不多吧. 离线的做法很简单,不再说了 以前做过. 主席树的做法就比较暴力了.. 什么是主席树呢.. 其实是某种称号. 在该题中的体现是可持久化的线段树. 对于一个数 如果以前没出 ...

  2. SPOJ 3267 D-query(离散化+主席树求区间内不同数的个数)

    DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, ..., an and ...

  3. 【树状数组】区间出现偶数次数的异或和(区间不同数的异或和)@ codeforce 703 D

    [树状数组]区间出现偶数次数的异或和(区间不同数的异或和)@ codeforce 703 D PROBLEM 题目描述 初始给定n个卡片拍成一排,其中第i个卡片上的数为x[i]. 有q个询问,每次询问 ...

  4. LightOj1028 - Trailing Zeroes (I)---求因子个数

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1028 题意:给你一个数 n (1<=n<=10^12), 然后我们可以把它 ...

  5. POJ 2992 求组合数的因子个数

    求C(n,k)的因子个数 C(n,k) = (n*(n-1)*...*(n-k+1))/(1*2*...*k) = p1^k1 * p2^k2 * ... * pt^kt 这里只要计算出分子中素数因子 ...

  6. Divisors_组合数因子个数

    Description Your task in this problem is to determine the number of divisors of Cnk. Just for fun -- ...

  7. POJ 2992 Divisors (求因子个数)

    题意:给n和k,求组合C(n,k)的因子个数. 这道题,若一开始先预处理出C[i][j]的大小,再按普通方法枚举2~sqrt(C[i][j])来求解对应的因子个数,会TLE.所以得用别的方法. 在说方 ...

  8. Factors of Factorial AtCoder - 2286 (N的阶乘的因子个数)(数论)

    Problem Statement You are given an integer N. Find the number of the positive divisors of N!, modulo ...

  9. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛-等式(求$N^2$的因子个数)

    一.题目链接 https://www.nowcoder.com/acm/contest/90/F 二.题面 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言655 ...

随机推荐

  1. Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name:

    异常引发的问题: 线程模型 如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,⽐如只是在内存中记个标识,则直接在 IO 线程上处理更快,因为减少了线程池调度. 但如果事件处理逻辑较慢,或者需 ...

  2. JS对象2

    1.Date对象 创建对象 //方法1:不指定参数 var nowd1=new Date(); alert(nowd1.toLocaleString( )); //方法2:参数为日期字符串 var n ...

  3. HTML入门6

    这篇将简单会编写网页整体网站架构,通过HTML来表示网站结构. 标题<header>,通常顶部有个大标题或图标,是网站的主要常见信息,存在于每个网页 导航<nav>,通常包含菜 ...

  4. Python 面试中可能会被问到的30个问题

    第一家公司问的题目 1 简述解释型和编译型编程语言? 解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译.这样解释型语言每执行一次 ...

  5. (转)JDK 1.8 预览版Lambda语法分析

    一.lambda含义     lambda表示数学符号“λ”,计算机领域中λ代表“λ演算”,表达了计算机中最基本的概念:“调用”和“置换”.在很多动态语言和C#中都有相应的lambda语法,这类语法都 ...

  6. Multi-Projector Based Display Code ---- FAQ

    Frequently Asked Question How do I know that my camera has a proper lens? Answer: If you can see exa ...

  7. Express全系列教程之(八):session的基本使用

    一.关于session session是另一种记录客户状态的机制,与cookie保存在客户端浏览器不同,session保存在服务器当中:当客户端访问服务器时,服务器会生成一个session对象,对象中 ...

  8. vue加载流程

    首先加载main.js,main.js中new一个vue实例,这个实例中会有一个id="app"映射到app.vue,启动时候首页映射到index.html,其中<div i ...

  9. android上的bin/sbin/xbin等各种目录

    1. /system是用于存储 由AOSP构建生成的 不可变组件的 主要Android目录.这包括本机二进制文件,本机库,框架包和存储主要的应用程序.它通常是从根文件系统的单独映像中以只读方式挂载的, ...

  10. HBuilder打包vue项目app后空白,并请求不到数据

    (解决空白问题)在打包之前一定要修改 config 目录下的 index.js 文件中的 bulid 模块打包配置项,否则会出现空白,如图   修改前 assetsPublicPath= '/',. ...