我正在尝试一个问题,我们应该递归计算一个数字的总和,直到剩下一个数字。我的程序失败了2个非常具体的测试用例(10 ^ 15)个数字。逻辑是为较小的输入工作(<10 ^ 15)。
这是我的代码
import sys
test_cases=int(input())
number_single=list(range(0,10))
while(test_cases!=0):
digit_sum=0
summation1=0
summation2=0
sub_case=int(input())
while(sub_case!=0):
length,number=map(int,sys.stdin.readline().split())
summation=length*number
summation1+=summation
sub_case=sub_case-1
digit_sum,digit_sum1=summation1,summation1
while(digit_sum not in number_single):
digit1_sum=digit_sum%10
digit_sum=int(digit_sum/10)
digit_sum=digit1_sum+digit_sum
print(digit_sum)
test_cases=test_cases-1
如果数字为17654,那么所需输出的格式为输出为5。
答案 0 :(得分:1)
在没有其他理解的情况下,我会提供一些基本代码,可以帮助您清除一些额外的设计。
首先,这被称为数字的“数字根”。这个过程的旧术语是“淘汰9”。使用模数运算符很简单:
target = 314159265358979323846364338327950197169
dig_root = target % 9
if dig_root == 0:
dig_root = 9
print ("digital root", dig_root)
但是,如果您应该通过添加数字的“手动”过程,那么请利用语言的类型功能。将其转换为字符串,将每个字符转换为单个数字的整数,然后添加它们。重复直到总和不超过9。
while target > 9:
target_str = str(target)
target = 0
for c in target_str:
target += int(c)
print (target)
使用列表推导,这将减少为
while target > 9:
target = sum([int(c) for c in str(target)])
print (target)
答案 1 :(得分:0)
我已经解决了这个问题。测试用例没有通过,因为我没有使用楼层划分(//)而是我正在执行正常划分并取整数结果。这导致程序失败的那些2大案例。