X以下の最大のべき乗数を出力するプログラムを作りたい。
問題のリンク:Atcoder097B
制約
・1 <= x <= 1000
・xは整数
・べき乗数とは、ある1以上の整数bと2以上の整数pを使ってb^pとかける整数のことを指すこととします。
この問題を解くために以下のプログラムを実装しました。
c++
1#include<bits/stdc++.h> 2using namespace std; 3int main(){ 4 int x; 5 cin>>x; 6 set<int> s; 7 8 //setに1000以下のべき乗数を全て用意 9 for(int i=1;i<=31;i++){ 10 for(int j=2;j<=9;j++){ 11 int a=pow(i,j); 12 if(1000<a) break; 13 s.insert(a); 14 } 15 } 16 17 //x以下の最大べき乗数を出力する 18 auto itr = s.end(); 19 while (itr != s.begin()) { 20 if(*itr<=x){ cout<<*itr; return 0; } 21 itr--; 22 } 23} 24
しかし、実行結果が以下のようになってしまい、上手くいきません。
(入力が10の時は上手くいった。)
入力:1 --> 出力:何も出てこない
入力:999 --> 出力:41
そこでsetの中身を、スペースで区切って末尾のイテレータから出力すると、以下のような結果になりました。
41 1000 960 899 840 783 729 675 624 576 528 512 483 440 399 361 343 324 289 256 243 224 216 196 168 144 128 124 120 99 81 64 49 36 32 27 24 16 9 8 4
ここで、以下の疑問点が浮かび上がりました。
・なぜ41という値が入っているのか?
・41がなぜ一番最初に出力されるのか?
・なぜ10^2や5^2の値がpow関数で正しく計算されていないのか?
・なぜ1^2や1^3の値がsetに入っていないのか?
これらの疑問点について、回答していただけると幸いです。
環境
OS:windows10
エディタ:atom
コンパイラ:MinGW
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/09 07:56