[質問文]
こんにちは,今回はyukicoderというサイトの問題で質問させていただきに来ました.
こちらにNo.47の問題,
http://yukicoder.me/problems/89
があります.前提として,自分はこの問題を人づてに聞いておりまして,
最初2進数であらわす問題だと思って以下に示すコードを作りました.
ですが,実際に問題サイトへいってみると,ビスケット1000枚 --> 10回 が答えになっており
,疑問に思い,他の方のコードを拝見させていただくと,どうも 2^k ≧ Nとなるkを求めているようでした.
そこで質問なのですが,
- この問題は,「N = ビスケット数,となるように2の指数で増えるポケットをだけをつかってビスケットを増やす.そのためにポケットにいれるビスケットの数を調整する」という問題なのでしょうか?
つまり,2^k ≧ Nとなるkをもとめる問題では無いという解釈でいいのでしょうか?
2. 自分の問題解釈があっているなら,1000 --> 10にできるような組み合わせが存在するということでしょうか?
3. 解釈が間違っているのなら,いかに示すコードは,自分の解釈通りなら正解のコードといえるでしょうか?
[ソースコード]
#include <iostream>
#include <string>
int sumTataku( int n )
{
int ans = 0;
int on_bit_num = 0, dist = 0; int temp = n, dist_calc = 0; do{ if( temp % 2 ){ ++on_bit_num; dist += dist_calc; } ++dist_calc; } while( ( temp = temp >> 1 ) > 0 ); std::cout << "on_bit_num = " << on_bit_num << "\n"; std::cout << "dist = " << dist << "\n"; ans += dist; temp = on_bit_num; if( temp % 2 && temp > 1){ ++ans; } on_bit_num = 0; dist = 0; dist_calc = 0; do{ if( temp % 2 ){ ++on_bit_num; dist += dist_calc; } ++dist_calc; } while( ( temp = temp >> 1 ) > 0 ); std::cout << "on_bit_num2 = " << on_bit_num << "\n"; std::cout << "dist2 = " << dist << "\n"; ans += dist; return ans;
}
void mysource()
{
while( true ){
try{
std::cout << "number : ";
std::string strn;
std::cin >> strn;
int n = std::stoi( strn );
std::cout << " ans = " << sumTataku( n ) << "\n\n";
}
catch( ... ){
break;
}
}
}
int main()
{
mysource(); return 0;
}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/07/13 05:55