一道相亲题

在微信上看到一条非常有意思的相亲图片

第一道题,707829217开方数以内的数,也就30000以内,暴力枚举进行素数检查就行。

附加题:

排列组合+递归分治

附加题程序:

def zuheshu(n, k):#Cnk
    fenzi = 1;
    fenmu = 1;
    for i in range(k):
        fenzi *= n-i;
        fenmu *= i+1;
    return fenzi/fenmu;
def ndigit_num3_p(n):#任意n位数所含的3的总数
    sum = 0;
    for i in range(n):
        k = i+1;
        sum += k * zuheshu(n,k) * pow(9, n-k)
    return sum
def ndigit_num3_q(n):#以3开头的任意n+1位数所含3的总数
    sum = 0;
    for i in range(n+1):
        k = i;
        sum += (k+1) * zuheshu(n,k) * pow(9,n-k)
    return sum;

def jiou_res(num):#0~num的任意数所含3的总数,
    if num < 3:
        return 0;
    if num < 10:
        return 1;
    strnum = str(num)
    head = int(strnum[0])
    n = len(strnum) - 1
    tail = int(strnum[1:])
    if head < 3:
        res = head*ndigit_num3_p(n) + jiou_res(tail)
    elif head == 3:
        res = head*ndigit_num3_p(n) + (tail+1) + jiou_res(tail)
    else:
        res = (head-1)*ndigit_num3_p(n) + ndigit_num3_q(n) + jiou_res(tail)
    return res;

def main_hzq():
    res = jiou_res(707829217) - jiou_res(70782921)*4 - jiou_res(70782920)
    print(res)

368247332

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值