鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖

[已解决]今日一题

[复制链接]
 楼主| 发表于 2020-8-9 07:24:17 | 显示全部楼层
BSOD 发表于 2020-8-9 00:45
经过测试应该没有问题

很抱歉,这属于暴力解法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-9 09:08:32 From FishC Mobile | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-9 07:24
很抱歉,这属于暴力解法

三层for循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-9 12:10:02 | 显示全部楼层
不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-9 12:13:16 | 显示全部楼层
刚学编程,当习题练练手了,暴力不暴力的我就不懂了
以2 5 8为例,思路是用排列数公式分别算三位数,两位数,一位数的个数
只会算数字不重复的,有重复数字好像难好多,还得改了
import math

def comb(nums):
    i = sum(nums)
    fn = math.factorial(len(nums))
    n,s = 0,0
    for x in range(len(nums)):
        m = len(nums)-x
        s += fn//math.factorial(x)
        n += s*i//len(nums) * (10**(m-1))
    return n

nums = list(ord(i) - 48 for i in input().split())
print(comb(nums))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-9 12:59:42 | 显示全部楼层
March2615 发表于 2020-8-9 12:31
兄弟思路差不多,但这个思路有个致命问题:如何判断0不在第一位

附上我的代码,当时我就想到这个问题 ...

对哦,我忘了0的事情,如果默认不重复的情况的话,我是这样改的
import math

def comb(nums):
    i = sum(nums)
    fn = math.factorial(len(nums))
    n,s,d= 0,0,0
    for x in range(len(nums)):
        m = len(nums)-x
        s += fn//math.factorial(x)
        n += s*i//len(nums) * (10**(m-1))
    return n

nums = list(ord(i) - 48 for i in input().split())
ans = 0
if 0 not in nums:
    ans = comb(nums)
else:
    ans = comb(nums)
    nums.remove(0)
    ans -= comb(nums)
print(ans)
就是有0的这一组数算出来的结果,减去去掉0之后的这一组算出来的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-9 22:10:47 | 显示全部楼层
LZXXXXX 发表于 2020-8-9 12:13
刚学编程,当习题练练手了,暴力不暴力的我就不懂了
以2 5 8为例,思路是用排列数公式分别算三位 ...

好,我研究一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-9 22:10:52 | 显示全部楼层
LZXXXXX 发表于 2020-8-9 12:59
对哦,我忘了0的事情,如果默认不重复的情况的话,我是这样改的

就是有0的这一组数算出来的结果,减去 ...

好,我研究一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-10 10:39:23 | 显示全部楼层

这个我看只能用多从For循环也就是暴力算法解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-10 10:50:21 | 显示全部楼层
陈尚涵 发表于 2020-8-10 10:39
这个我看只能用多从For循环也就是暴力算法解决了

你看和没看一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-10 12:46:10 | 显示全部楼层
result=[]
def main():
    test_list=[2,5,8]
    ll=len(test_list)
   
    #cal(test_list,ll,0)
   
    for i in range(1,2**ll):
        choice=choose(i,ll)
        test1=[]
        for j in range(ll):
            if choice[j]!=0:
                test1.append(test_list[j])
        cal(test1,len(test1),0)
        
    print(sum(result))

   
def cal(test_list,n,x):
    for i in range(n):
        if n==1:
            result.append(test_list[i]+10*x)
            break
        else:
            y=test_list[i]+10*x
            test1=test_list[:i]+test_list[i+1:]
            cal(test1,n-1,y)

def choose(n,ll):
    list1=[0]*ll
    for i in range(ll):
        list1[i]=n%2
        n=n//2
    return list1
   

if __name__=="__main__":
    main()


不知道这个符不符合楼主的要求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-11 10:42:24 | 显示全部楼层
a, b, c = eval(input("请输入三个数(每输入完一个数加','):"))

Odd_number = a + b + c
Even_number = (a * 10 + b) + (a * 10 + c) + \
              (b * 10 + a) + (b * 10 + c) + \
              (c * 10 + a) + (c * 10 + b)
Three_numbers = (a * 100 + b * 10 + c) + (a * 100 + c * 10 + b) + \
                (b * 100 + a * 10 + c) + (b * 100 + c * 10 + a) + \
                (c * 100 + a * 10 + b) + (c * 100 + b * 10 + a)

print(Odd_number + Even_number + Three_numbers)
最笨比的做法没有之一
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-11 10:50:21 | 显示全部楼层
"""
思路:1,2,3
一位数之和:1 + 2 + 3
两位数之和:(1 + 2 + 3) * 10 * 2 + 
                        (1 + 2 + 3) * 1 * 2
                ==(1 + 2 + 3) * (10 + 1) * 2
三位数之和:(1 + 2 + 3) * 100 * 2 + 
                        (1 + 2 + 3) * 10 * 2 + 
                        (1 + 2 + 3) * 1 * 2 
                ==(1 + 2 + 3) * (100 + 10 + 1) * 2
所以1,2,3组成的n位数之和 = 
                        (1 + 2 + 3) * 
                        (10**n + 10**(n-1) + ... + 10 + 1) *
                        M 
这个 M 就是 n 位数的个数除以 n
   比如1,2,3,4组成的三位数的和中的 M
                   M = 4 * 3 * 2 / 4

所以N个一位数组成的数中n位数的和 = 
                        (组成的一位数之和) *
                        (10**n + 10**(n-1) + ... + 10 + 1) *
                        M

把所有n位数的和加起来就等于N个一位数组成的数的和

"""

# (10**n + 10**(n-1) + ... + 10 + 1)
def mul(n):
        if n == 1:
                return 1
        else:
                return 10**(n-1) + mul(n-1)

# M = num(l-1) / num(l-i)
def num(n):
        if n == 0:
                result = 1
        else:
                result = n
                for i in range(1,n):
                        result *= i
        return result

# 求总和
def sums(l,numbers):
        sums = 0
        for i in range(1,l+1):
                sums += sum(numbers) * mul(i) * num(l-1) / num(l-i)
        return sums

# 显示结果
def results():
        numbers = []
        number = input('Please enter any integer greater than 0:')
        for i in number:
                numbers.append(int(i))
        l = len(numbers)
        result = sums(l,numbers)
        print(result)
        
results()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-12 21:51:46 From FishC Mobile | 显示全部楼层
不用外带库的初级解法 拿手机发的 所以看起来可能会不得劲
str = input('输入吧')
g = list(map(int,str.split()))
a= len(g)
i=[]
def f(n):
    i=n
    m=1
    while i:
        m =m*i
        i-=1
    return m
def A(m,n):
    c=f(n)//f(n-m)
    return c
for c in range(1,a+1):
    for d in range (c-1,a):
        e=A(d,a-1)
        j=e*(10**(c-1))
        i.append(j)

total1 =0
for x in range(0,len(i)):
    total1 += i[x]
print(total1)
total2 =0
for x in range(0,len(g)):
    total2 += g[x]
print(total2)
print(total1*total2)

   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-12 21:54:03 From FishC Mobile | 显示全部楼层
phython初学者 再加上匆忙编的 可能有些不规范 但是测试是正确的 只是不知道这算不算是暴力破解  两个def 只是为了定义 排列
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 17:03:15 | 显示全部楼层
str = input('输入吧')
g = list(map(int,str.split()))
a= len(g)
i=[]
def f(n):
    i=n
    m=1
    while i:
        m =m*i
        i-=1
    return m
def A(m,n):
    c=f(n)//f(n-m)
    return c
for c in range(1,a+1):
    for d in range (c-1,a):
        e=A(d,a-1)
        j=e*(10**(c-1))
        i.append(j)

total1 =0
for x in range(0,len(i)):
    total1 += i[x]
print(total1)
total2 =0
for x in range(0,len(g)):
    total2 += g[x]
print(total2)
print(total1*total2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 17:42:10 | 显示全部楼层
我数学不好是不是学不会编程了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 21:48:02 | 显示全部楼层
本帖最后由 newoay 于 2020-8-13 22:12 编辑

没有考虑如果数字中存在0的情况

from math import factorial

#计算排列组合数
def permutations_sum(n,m):
    return factorial(n)/factorial(n-m)
def combinations_sum(n,m):
    return factorial(n)/(factorial(m)*factorial(n-m))

#计算每个数字在各位置出现次数
def each_num_t(N):
    number_list=[]
    times_of_sum=0
    for j in range(N,0,-1):
        times_of_sum += permutations_sum(j,j)*combinations_sum(N,j)/N
        number_list.append(times_of_sum)
    number_list.reverse()
    return number_list

def sum_all():
    nums_list=[int(x) for x in str(input('输入数字:(如2 5 8)')).split(' ')]
    N=len(nums_list)
    n=each_num_t(N)
    result=0
    for item in n:
        leval=pow(10,n.index(item))
        result+=sum(nums_list)*item*leval
    return result

def main():
    print('和是:',sum_all())

if __name__ == "__main__":
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 22:16:04 | 显示全部楼层
newoay 发表于 2020-8-13 21:48
没有考虑如果数字中存在0的情况

from math import factorial

如果有0存在,比如2 5 8 0 四个数字,重新定义一下求和函数,用2 5 8 0 的结果减掉 2 5 8的结果就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-5 03:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表