经过测试应该没有问题
很抱歉,这属于暴力解法 永恒的蓝色梦想 发表于 2020-8-9 07:24
很抱歉,这属于暴力解法
三层for循环{:10_247:} 不会{:10_262:} 刚学编程,当习题练练手了,暴力不暴力的我就不懂了{:9_221:}
以2 5 8为例,思路是用排列数公式分别算三位数,两位数,一位数的个数
只会算数字不重复的,有重复数字好像难好多,还得改了{:9_222:}
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)) 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之后的这一组算出来的结果 LZXXXXX 发表于 2020-8-9 12:13
刚学编程,当习题练练手了,暴力不暴力的我就不懂了
以2 5 8为例,思路是用排列数公式分别算三位 ...
好,我研究一下{:10_323:} LZXXXXX 发表于 2020-8-9 12:59
对哦,我忘了0的事情,如果默认不重复的情况的话,我是这样改的
就是有0的这一组数算出来的结果,减去 ...
好,我研究一下{:10_323:} 永恒的蓝色梦想 发表于 2020-8-9 22:10
好,我研究一下
这个我看只能用多从For循环也就是暴力算法解决了 陈尚涵 发表于 2020-8-10 10:39
这个我看只能用多从For循环也就是暴力算法解决了
你看和没看一样{:10_249:} result=[]
def main():
test_list=
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!=0:
test1.append(test_list)
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+10*x)
break
else:
y=test_list+10*x
test1=test_list[:i]+test_list
cal(test1,n-1,y)
def choose(n,ll):
list1=*ll
for i in range(ll):
list1=n%2
n=n//2
return list1
if __name__=="__main__":
main()
不知道这个符不符合楼主的要求 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)
最笨比的做法没有之一 """
思路: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() 不用外带库的初级解法 拿手机发的 所以看起来可能会不得劲
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
print(total1)
total2 =0
for x in range(0,len(g)):
total2 += g
print(total2)
print(total1*total2)
phython初学者 再加上匆忙编的 可能有些不规范 但是测试是正确的 只是不知道这算不算是暴力破解两个def 只是为了定义 排列 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
print(total1)
total2 =0
for x in range(0,len(g)):
total2 += g
print(total2)
print(total1*total2) 我数学不好是不是学不会编程了{:5_107:} 本帖最后由 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=
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() newoay 发表于 2020-8-13 21:48
没有考虑如果数字中存在0的情况
from math import factorial
如果有0存在,比如2 5 8 0 四个数字,重新定义一下求和函数,用2 5 8 0 的结果减掉 2 5 8的结果就可以了
页:
1
[2]