2016-12-19 4 views
-2

Pythonまたはシェルスクリプトで特定の範囲の数値を調べたいと思っています。各数字について、その桁の合計を求め、合計を8で割り、残りが1から4の間であればその数字を印刷します。数字の合計を求め、8で除算するときの剰余を確認してください。

例。 28/8

5 + 9 + 5 + 9 = 28

剰余4.

4 1〜4の範囲内に来るので、印刷番号5959と次の番号に移動します。余りが1から4の範囲にない場合、それを無視して次の番号に進みます。

これまで私はこれを試しましたが、私が期待していることはしません。私があなただったら

count = 0 
lower = 5959 
while (count<1000): 
sum_digit= lower%8 

count+=1 
lower+=1 
if 1<=sum_digit<=4: 
    print lower 
+2

'sum_digit'は5959モジュロ8をない与えて動作します数字の和 – ruaridhw

+0

数字の合計のリマインダが必要です。 – user7315541

+0

"28/8の残り"は実際には "4/8"、または "0.5"ではありませんか? '28%8 'のモジュラスは4です。現在、' sum_digit = 5959%8'、 '7' –

答えて

4

各数字の桁の合計の残りのmod 8を見つける必要があります。 lower%8を実行すると、数値自体の残りのmod 8が見つかるだけです。

数字の数字を合計する最も単純な方法は、最初に文字列に変換して個々の数字をループすることです。これらの数字のそれぞれを整数に変換して、算術演算を行うことができます。あなたが使用することができますmap機能を使用しない場合

for n in range(5959, 5980): 
    if 0 < sum(map(int, str(n))) % 8 < 5: 
     print(n) 

出力

5959 
5960 
5965 
5966 
5967 
5968 
5974 
5975 
5976 
5977 

扱いやすい出力を維持するためには、私が小さい範囲を使用しますジェネレータ表現:

for n in range(5959, 5980): 
    if 0 < sum(int(d) for d in str(n)) % 8 < 5: 
     print(n) 

FWIWは、これは1行に書き込むことができますが、私見では、私の以前のバージョンでははるかに読みやすいです:

print(*(u for u in range(5959,5980)if 0<sum(map(int,str(u)))%8<5),sep='\n') 
+0

スクリプトは条件を満たす5961を見逃します。 – Fomalhaut

+0

@Fomalhaut 5 + 9 + 6 + 1 = 21,21 = 2 * 8 + 5 5の残りは1から4の範囲で要求されていません。 –

+0

申し訳ありませんが、/8は3 'です... – Fomalhaut

2

、数字の合計を計算するために、私は次のように行っているでしょう:あなたの現在のコードでは

>>> my_num = 5959 
>>> sum(int(i) for i in str(my_num)) 
28 

、私はあなたが数字のsumを計算表示されません。

+0

私の解決策は 'for'ループです。まだ私はhiroの主役の解決が速くないかどうか疑問に思います。 – sobek

0

これが動作するかどうかを参照してください:

number = 5959 
sum = 0 
for digit in str(number): 
    sum += int(digit) 
mod = sum % 8 
2

またはstrを使用していないバージョン:

count = 0 
lower = 5959 
while lower: 
    count += lower % 10 
    lower //= 10  # //= for python 3; /= for python 2 

これはただの数字の合計を計算します。

+0

これはちょうど数字の合計です、それはmod 8のものをしません。そして、Pythonが動作するため、 'str'はCの速度で算術演算を行うので、' sum(map(int、str(n))) 'の私のトリックよりも遅いです。 –

+0

@ PM2Ring:そうです、それは数字の合計のためです。速度について: 'timeit'のクイックベンチマークは、私のバージョンが少し速いと言っています。あなたのスケールはもっと良くなります...(100桁のマイナーはやや先です)。 –

+0

ああ、大丈夫です。私はページをリフレッシュしていないので、私はあなたの編集を見ませんでした。私は私のバージョンがtimeitテストで少し遅いことに驚いています。私は今日、これらのアルゴリズムのスピードテストを行っていませんが、私は過去にそれらをテストしたと確信しています... –

0
def main(): 
    count = 0 
    lower = 5959 
    while (count<1000): 
     lowersum = sum_digits(lower) 
     sum_digit= lower%8 
     count+=1 
     lower+=1 
     if 1<=sum_digit<=4: 
      print (sum_digit,lowersum) 

def sum_digits(n): 
    sum = 0 
    while n: 
     sum += n % 10 
     n //= 10 
    return sum 
main() 

ホープこれは

関連する問題