一系列数字的内和

时间:2019-07-17 10:47:10

标签: python python-3.x algorithm

按内部总和,我的意思是123的内部和等于1 + 2 + 3 = 6

说我有两个数字,它们表示从标准输入中得到的一个(包括)范围a和b,并且我想添加该范围内所有数字的内部和。我的解决方案:

a, b = sys.stdin.readline().split()
a = int(a)
b = int(b)
s = 0
for x in range(a, b+1):
    t = str(x)
    s = s + sum([int(i) for i in t])
print(s)

工作正常。但是有没有更快的方法?我感觉列表理解的用法很慢,所以我想在这里输入一些信息。

3 个答案:

答案 0 :(得分:1)

请注意,如果最高有效位msd没有变化,总和只会增加一个,而无需重新计算。同样如果msd发生变化,则总和等于msd

s = 0
a = 12
b = 37

last_msd = None
last_sum = None
for x in range(a, b + 1):
    t = str(x)
    msd = int(t[0])
    if last_msd is None:
        last_msd = msd
        last_sum = sum(int(i) for i in t)
    elif msd != last_msd:
        last_msd = msd
        last_sum = msd
    else:
        last_sum += 1
    s += last_sum
print(s)  # 169

请注意,无需在list内创建sum;生成器表达式即可。

您可能会发现比oeis更有效的方法:A007953(数字总和)或A037123累积的数字总和。

答案 1 :(得分:1)

如果a和b足够大,则可以使用以下方法。如果a和b的最大长度为n(a或b中的位数),则复杂度为O(n * 10 * n)。 因此,如果数字(a或b)为10 ^ 9,则复杂度约为(9 * 9 * 10)= 810

我首先计算所有不超过b的数字的总和(summation(b)),然后找到所有不超过a-1的数字的总和(sum(a-1))。通过sumsum(b)-summation(a-1)获得期望的结果。

import sys
def power(x):
    po=1
    for i in range(x):
        po=po*10
    return po
def summation(x):
    s=str(x)
    le=len(s)
    res=0
    carry=0
    for i in range(le):
        c=int(s[i])
        rem=le-i-1
        for j in range(c):
           res=res+((carry+j)*power(rem)+45*(rem)*power(rem-1))
        carry+=c
    res+=carry
    return res


a, b = sys.stdin.readline().split()
a = int(a)
b = int(b)
s = 0

#Bruteforce
for x in range(a, b+1):
    t = str(x)
    s = s + sum([int(i) for i in t])

#Optimized
res=summation(b)-summation(a-1)

print(res,s)

答案 2 :(得分:0)

正是出于这个目的,我们有import { Component, Input, OnInit } from '@angular/core'; import { AccountService } from 'src/app/services/account.service'; import { Observable } from 'rxjs'; @Component({ selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.css'] }) export class HomeComponent implements OnInit { pgtitle:string = "SCB Dashboard"; loginStatus$ : Observable<boolean>; username$ : Observable<string>; constructor( private acc:AccountService ){} ngOnInit() { this.loginStatus$ = this.acc.isLoggedIn; this.username$ = this.acc.currentUserName; console.log(this.loginStatus$); //here it ruturns an object console.log(this.username$); //and here too... } }

functools.reduce