##やりたいこと
学校から出された問題で、
以下の問題の条件を満たすための計算速度を底上げしたい
問題:以下の問に答えよ
2以上7以下の互いに素な素数が3つ存在している
それら3つの素数の累乗積を小さい順に並べよ
そして指定番号の数字を表示せよ
「但し、順に並べた数字は1000個目まで考慮し、
実行時間は16.0s未満とする」
例)素数 2 3 7
数列上で8番目の数字
203070=1
213070=2
203170=3
223070=4
213170=6
203071=7
233070=8
20327****0=9
8番目の数字は9
これの1000番目の数字を時間内に求めたい
##環境
jupyter6.0.0
python3.7.4
##やったこと
考え方として、累乗の数を変化させるのではなく3つの素数のうちどれかで割り切れるか、を素数1個1個で試す形にしました。
理由としては累乗の数を増減させた場合、以下の事故が起きる可能性が出てくると考えたからです
例)上記の霊でまず累乗を0から1まで絞る->出てくる数字 1 2 3 6 14 21 42
次に累乗を1から2まで試す->出てくる数字 4 9 12 .. =>先に出た数字よりも小さいものが出てきてしまう為
数字の順がめちゃくちゃになる
よって以下のソースコードで
素数 2 3 5
指定番号 750番目
にすると実行時間 43.425915002822876
になりました
python
1import time 2 3def warizan(cur,sosu): 4#割り切れなくなるまで割り算を行う 5 while(True): 6 if cur%sosu==0: 7 cur=cur/sosu 8 else: 9 break 10 return int(cur) 11 12 13 14def while_math(a,sosu_list): 15#数字の末尾が偶数かどうかや全ての桁の数字を足して3で割れるかどうかを試している 16 cur=a 17 pre_result=str(cur) 18 matubi=int(pre_result[len(pre_result)-1]) 19 20 if 2 in sosu_list : 21 if matubi%2==0: 22 cur=warizan(cur,2) 23 24 if 3 in sosu_list: 25 pre_result=[int(x) for x in str(cur)] 26 _all=sum(pre_result) 27 if _all%3==0: 28 cur=warizan(cur,3) 29 30 if 5 in sosu_list : 31 if matubi%5==0: 32 cur =warizan(cur,5) 33 34 if 7 in sosu_list: 35 cur=warizan(cur,7) 36 if cur==1: 37 return a 38 else :return 0 39 40#---ここまでで関数定義 41 42input_math=input() 43math_list=list(input_math.split(" ")) 44sosu_list=[] 45 46[sosu_list.append(int(math_list[i])) for i in range(0,3)] 47result_idx=int(math_list[3]) 48sosu_list.sort() 49result_list=[] 50a=1 51start=time.time() 52while(True): 53 if len(result_list)>=result_idx: 54 break 55 result=while_math(a,sosu_list) 56 if result!=0: 57 result_list.append(result) 58 a+=1 59end=time.time()-start 60#print(result_list) 61#[print(result_list[i]) for i in range(0,100)] 62print("経過時間",end) 63print(result_list[result_idx-1]) 64
恐らくもっと良い計算方法があると思うのですが、これが限界でした
どうかよろしくお願いします
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/04 13:33
2020/03/04 14:52
2020/03/04 22:09
2020/03/06 07:14
2020/03/06 09:05
2020/03/09 03:40