按内部总和,我的意思是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)
工作正常。但是有没有更快的方法?我感觉列表理解的用法很慢,所以我想在这里输入一些信息。
答案 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
;生成器表达式即可。
答案 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