1 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:16:00 ] 他人のソースを読むことは非常に勉強になります。 と言うわけで、初心者〜プロの方まで様々な人が書いたソースを見て、より良いプログラムを作れるようになろうと言う目論見です。 問題は未来アンカーで踏んだ人が空気を読んだ問題を出しましょう。 解答ソースを貼る人用テンプレ 【C言語歴】 (例)4年 【レベル】 (例)初心者、プロ、学校で習った程度 など 【コンセプト】 (例)処理速度重視、可読性重視、容量重視 など 【コメント】 (例)みっくみくにしてやんよ。など、有れば 長すぎるソースはこちらへ ttp://codepad.org/ 宿題は C/C++の宿題片付けます 130代目へ pc12.2ch.net/test/read.cgi/tech/1250204272/ 相談は C言語なら俺に聞け(入門篇)Part54などへ pc12.2ch.net/test/read.cgi/tech/1254829314/
263 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 23:40:09 ] 46回より小さい回数(43回)で>>188 の並びを解く手順が>>253 にあるけど、 それをアルゴリズムとして定式化したときに、他のも46回未満で解けるかどうか。 試してみたところ、>>188 は43回で出来たが他のは下手すりゃ50回越えたりした。 もっとアルゴリズムを改善すればできるのかもしれないが、できないかもしれない。 この問題を解くアプローチとしては、次のどちらか ・どんな札でも46回よりも少なく解ける取り方のアルゴリズムを開発してみる ・プレイヤーと、いじわるな運命の神様の2人プレイのゲームとみなして、 プレイヤーの行動に対し、常に最悪なカードを返しつづける神様のアルゴリズムを開発する (最初から札を固定で与えるのじゃなくて、プレイヤーの行動によって次に出すカードを選ぶ) になると思う。
264 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 01:07:35 ] >>263 >>253 の技がよく分からん・・ そのアプローチは両方面白いな、試して見る。
265 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 08:43:31 ] 問題、ドラクエのまんたんを実装せよ。 MP、回復量はホイミ2:20、ベホイミ5:75、ベホマ8:全快、ベホマラー15:75(全体)。 回復量に誤差はなし(難しくなるので)。 MPぱパーティー共通の物とし、少ないMPで全快させる。 表示のさせ方などは自由。 キャラの能力例 勇者/300 戦士/350 僧侶/250 魔法使い/200 (←キャラの名前、最大HP) (↓現在HP) 1、250 350 210 200 2、210 350 150 200 3、250 300 200 150 4、280 300 050 150 次の問題は>>280
266 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 08:53:21 ] ナップサック問題?
267 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 09:35:14 ] ベホマラーを使うかどうかを最初に判断。 後は個別に一番MP消費の少ない魔法を選ぶ。
268 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 10:30:09 ] ベホマラーを2回の使ったほうがいい場合は?
269 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 10:42:54 ] まず、ベホマラーなしでの最小MP消費を考える。 次に、ベホマラー1回での最小MP消費を考える。 次に、ベホマラー2回での最小MP消費を考える。 この中で最小のものを答えとする。 なお、ベホマラー3回以上はありえない(ベホマ*4の方が少なくなるから)
270 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 10:46:06 ] ベホマラー1回のときのMPがベホマラーなしのときのMPより多くて ベホマラー2回がベホマラーなしよりMPすくなくなる場合なんてあんの?
271 名前:268 mailto:sage [2010/05/03(月) 11:32:43 ] >>270 (↓現在HP) 150 200 100 50
272 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 20:57:29 ] >>265 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10585.cpp 使い勝手の悪いところがあります。直せる方は教えてください。
273 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 01:19:30 ] >>272 問題は正解! ベホマラー3回は無い事や、ベホマよりベホイミ+ホイミ の方がMPが少ない事も考慮されててgood。 使いにくくはなかったけど、HP入力ボックスの右か下に /300とかと最大HPを表示するといいかも。 後、結果がメインウィンドウとMsgBox両方に表示されるが、 メインウィンドウの方は表示が途中できれてしまう。
274 名前:272 mailto:sage [2010/05/04(火) 14:39:51 ] (修正しました)タブキーで移動したいのですが、やり方をご存知の方居ませんか? kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10586.c
275 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 21:17:15 ] 以下 loopyなループ === 開始 ===
276 名前:デフォルトの名無しさん [2010/05/05(水) 03:20:55 ] She never eats NONI.
277 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 07:52:30 ] loopy goopy
278 名前: ◆5yaOF3KA5w mailto:sage [2010/05/05(水) 17:45:05 ] うむ
279 名前:デフォルトの名無しさん [2010/05/06(木) 04:04:32 ] 五月病の季節
280 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 10:43:13 ] 亀だが>>1 やってみた 【C言語歴】 2年 【レベル】 ゲーム製作やってるぐらい 【コンセプト】 慣れた方法で。 #include <iostream> #include <vector> const static int NUM_SIZE = 5; void main() { std::vector<int> intContiner; int temp = 0; int sum = 0; std::cout << "5つ数を入力して下さい。" << std::endl; for( int i = 0 ; i < NUM_SIZE ; ++i ) { std::cout << i + 1 << "番目入力" << std::endl; std::cin >> temp; intContiner.push_back( temp ); } std::cout << "5つ数の合計" << std::endl; std::vector<int>::iterator itr = intContiner.begin(); for( ; itr != intContiner.end() ; ++itr ) { sum += (*itr); } std::cout << sum << std::endl; std::cout << "5つ数の平均" << std::endl; std::cout << sum / NUM_SIZE << std::endl; }
281 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 12:44:44 ] >>280 tempは入力ループでしか使わないのだから、関数の先頭で宣言するのはバグの元。 sumは計算ループ以降でしか使わないのだから、関数の先頭で宣言するより直前で宣言した方が見通しがいい。 C流でやると言うのなら別に止めはしないが、iの宣言だけはポリシーに反することになるので美しくない。 あと、void main()よりもint main()の方が一般的だ。 ↓以下main()の戻り値の型についてのいつもの議論w
282 名前:デフォルトの名無しさん mailto:sage [2010/05/06(木) 12:48:54 ] >>281 イテレータの宣言位置が変態なのは指摘漏れ?w 処で、>280は切り捨てられた平均値なんだね。小数点以下一桁まで欲しくね?
283 名前:デフォルトの名無しさん mailto:sage [2010/05/07(金) 22:53:42 ] なんで const static int で宣言するんだ? メモリ無駄だろ。 しかも表示のところは 5 決め打ちだし。
284 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 01:06:15 ] > メモリ無駄だろ。 アホか?
285 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 02:29:33 ] >>283 知らないなら書かなくていいんだよ。
286 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 16:45:35 ] >>283 流石にワロタ
287 名前:デフォルトの名無しさん mailto:sage [2010/05/08(土) 21:53:40 ] >>283 の人気に嫉妬 というかどうみても釣り
288 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 06:01:52 ] >>274 ここのでできるかも。 ttp://www.sm.rim.or.jp/~shishido/wsclass.html
289 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 21:04:22 ] >>283 の前半はアレだけど、後半は同意する。
290 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 21:23:42 ] なんでお前ら揃って悪意に解釈してんだ? 俺は>>283 じゃないけどさ すぐ揚げ足とって茶化すのだけは得意だな もうちょっと意味、意図を汲み取る努力しろよ お前らみたいなのと仕事したくないな正直
291 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 21:25:52 ] 私女だけどコンソールのちょっとしたプログラムなのに 「メモリが無駄(キリッ」とか言ってる男の人って恥ずかしいと思う。 いつの時代のPC使ってるんだろ?きもーい
292 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 22:28:22 ] お前みたいなのがこうやって死んで会社や社会に迷惑掛けるんだよ tsushima.2ch.net/test/read.cgi/newsplus/1273411891/ tsushima.2ch.net/test/read.cgi/newsplus/1273746605/
293 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 01:17:43 ] >>290 悪意に解釈もなにも、メモリ無駄にならないのになるって書いてあるんだもん。
294 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 02:42:33 ] >>291 あんたの方がよっぽどきもい。
295 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 09:25:57 ] 拙者の彼女をプログラムしてくれでござる
296 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 11:26:35 ] > iの宣言だけはポリシーに反することになるので美しくない。 どゆこと?
297 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 12:57:01 ] >>296 また古いものをw >280では、以下の例外を除く変数は全て関数の先頭で宣言している。 但し、ループ制御のiだけはC99やC++でしか通用しない宣言を使っている。 また、>282でも指摘されているが、イタレータもブロックの途中で宣言している。 こういうのをポリシーがないというのだろ。
298 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:33:58 ] うちも今更>>2 をやってみる 【C++言語歴】約10年。 【レベル】いわゆるサンデープログラマ。主にフリーソフト制作等。 【コンセプト】 シンプルに。 【コメント】STLコンテナは簡潔に表記する為にある。本題でvector使うのは逆効果。 #include <iostream> #include <iterator> int main() { using namespace std; const int numberOfNumbers = 5; // 入力 cout << "数字を" << numberOfNumbers << "個入力" << endl; istream_iterator<double> it(cin); double sum = *it; for (int i = 1; i < numberOfNumbers; ++i) sum += *++it; double average = sum / numberOfNumbers; // 出力 cout << "合計: " << sum << endl; cout << "平均: " << average << endl; // 終わり return 0; }
299 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:36:56 ] 【問題2:ワード覆面算】 入力された任意の8文字以内の単語2つからワード覆面算を作成せよ 入力された単語に含まれない文字は適当な記号を用いて表示すること ただしそれぞれの覆面算は単一の解を持つものとし"浮き"は認めない 【難易度】 80分で中級 【入力例】 バナナ バナナ 【出力例】 バナナ+バナナ=ナナ◎ [ 499+499=998 ] バナナ+バナナ=○ナナナ [ 500+500=1000 ] バナナ+バナナ=△△バ◇ [ 577+577=1154 ] バナナ+バナナ=△△ナ◎ [ 599+599=1198 ] バナナ+バナナ=ナ△△△ [ 611+611=1222 ] バナナ+バナナ=△▽※バ [ 688+688=1376 ] バナナ+バナナ=△ナ△○ [ 755+755=1510 ] バナナ+バナナ=△☆バ※ [ 788+788=1576 ] バナナ+バナナ=△ナ☆◇ [ 877+877=1754 ] バナナ+バナナ=△◎ナバ [ 899+899=1798 ] バナナ+バナナ=△バ△○ [ 955+955=1910 ] 【補足】 上記はWikipediaの例"バナナ+バナナ=シナモン"に合わせただけであり 入力される単語2つが同じとは限らない
300 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:42:41 ] かなりの良スレの予感がするけど自分にはついてけないぜ・・・
301 名前:298 mailto:sage [2010/05/18(火) 22:01:47 ] 覆面算を解く問題はたまに見かけるのでちょっとひねって作成のほうにしてみました。 前回の出題よりは品質あげたつもりなんですがどうでしょう。 80分は作者が実際に解くのにかかった時間が基準なので異論は認めません。
302 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 03:07:45 ] using namespace std; ヒェー。
303 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 05:47:06 ] >>302 それを使うことの弊害を知りつつ使ってるのなら、無駄に恐れることはない。 おまじないのように付けてるのならタダのバカだけど、 おまじないのように避けてる人とそう変わらんよ。
304 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 12:43:18 ] >>302 標準ライブラリ以外のライブラリは使っていないのだから 故意にcoutという変数を定義するようなことをしない限り名前は衝突しない #include <iostream>してるんだから構文解析はそこで終わっていて std名前空間にcoutの定義を探しにいっても追加のコストはほどんどない と考えて記述が短くなる方を選んでるんだけど何か問題ありますか
305 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 13:16:46 ] nothing
306 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 15:38:45 ] おまじないのように付けてるタダの馬鹿ですんません・・・
307 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 15:39:29 ] >>299 バナナ+バナナ 099+099=198(○ナ○) 100+100=200(○ナナ) とかは不成立?
308 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 22:55:51 ] >>307 不成立です バナナ+バナナ=○ナ○ [099+099=198] 覆面算は同じ文字のところには同じ数字を入れるルールなので バナナ+バナナ=○ナ△のように記号を変えなければなりません また数字の先頭が0ではないというのは暗黙の了解になっていて こういった場合"バ"が0ではないことを利用して解くのが 普通なので099という表記もできません バナナ+バナナ=○ナナ [100+100=200] については他にも 200+200=400、300+300=600、400+400=800と回答が複数あるので パズルとして成立しません Wikipediaに解説があります ja.wikipedia.org/wiki/%E8%A6%86%E9%9D%A2%E7%AE%97
309 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 00:27:34 ] そういや、ここってスレタイにはC,C++って入ってるけど、限定する意味あんのか?
310 名前:307 mailto:sage [2010/05/23(日) 03:14:31 ] >>308 サンクス、了解した。
311 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 04:36:49 ] お題 (次>>350 ) 16進テキストをファイル・コマンド・またはgetsから入力して、 バイナリーに変換し、test.txtファイルに落とす。
312 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 05:46:32 ] %81%AB0%E3%81 とかも。 81 AB 30 E3 81
313 名前:デフォルトの名無しさん [2010/05/25(火) 19:41:39 ] お題: >>311 ,312に示す文章にはいくつかの誤りがあります。正しい日本語へ修正しなさい。
314 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 09:39:13 ] gets()を使えだなんてろくでもない問題、直すほどの価値もない。
315 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 10:03:55 ] >>314 使わせといてあとでこれこれこういう理由があるから使うな、と言った方が 何でか教えないけどとにかく使うな、よりは覚えると思う
316 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 10:21:26 ] >>315 そういうのは初心者スレでやれ。
317 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 11:19:19 ] それは>>314 に言ってくれ
318 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 11:29:50 ] ちょっと待ってくれ。 とどのつまりは>311の説明が下手なことが原因じゃないか。 ここは一つ、>311がお題を提示し直すまで静観しようじゃないか。
319 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 15:08:20 ] 例えば、gets()で1行入力 ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:%E6%A4%9C%E7%B4%A2?search=%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A22010 標準出力には、 E7 89 B9 E5 88 A5 E6 A4 9C E7 B4 A2 E3 82 A6 E3 82 A3 E3 82 AD E3 83 9A E3 83 87 E3 82 A3 E3 82 A2 ファイルには 文字コードUTF-8で、 ja.wikipedia.org/wiki/ 特別検索?search=ウィキペディア2010
320 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 22:57:18 ] >>319 何が言いたいんだよ。リンク間違ってるし。 あなたが311でgets()の使い方教えてあげてるつもりなら芯でくれ。 gets()は学校では習うかもしれないけど安全じゃないから誰も使わないの。 そもそもファイルからの入力にはgets()使えないでしょ。(本当は使えるけど。) もしファイルからの入力はどの関数を使ってもいいのに 標準入力にはgets()を使わなければいけないという意味なら問題がおかしい。 311は出力ファイルは指定しているのに入力ファイルは指定していなかったり バイナリーファイルの拡張子がtxtだったり なぜか"%AB0"とか三桁の数字がでてきたり意味不明な上に 16進テキスト(16進数のこと?)とかコマンド(コマンドラインのこと?)とか 単語も日本語の文法もめちゃくちゃなんだからウダウダいってないで直せよ。
321 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:02:13 ] お題を出す立場じゃなくて、課題を出された方なんだろうな。
322 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:03:04 ] 問題;scanf()で入力して、バイナリー変換し、ファイルに書き出してください。 %E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%BC%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%81%8Ctxt%E3%81%A0%E3%81%A3%E3%81%9F%E3%82%8A%20
323 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:13:10 ] >>322 嫌です。
324 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:22:31 ] URLデコーダー
325 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 00:25:12 ] あきらかに宿題だろ。
326 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 03:05:10 ] ていうか、>>311 には文字コード指定されてないんだから、空読みしてオレオレコードで書き出せばいいんじゃないの? #define ENOUGH_LONG_LENGTH 3 int main(void) { char buf[ENOUGH_LONG_LENGTH]; FILE *fp; int miyazaki = 0xdeadbeef; gets(buf); fp = fopen("test.txt", "wb"); fwrite(&miyazaki, sizeof(int), 1); fclose(fp); return 0; }
327 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 03:26:17 ] >>326 ところが>>322 でURLエンコードのデコードをバイナリー変換と呼んでるらしいことが 判明しているのでそれでは正解にならない つか宮崎って何w
328 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 04:01:43 ] >>327 deadbeef…(´;ω;`)ブワッ
329 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 08:08:54 ] >>320 >バイナリーファイルの拡張子がtxtだったり ftpでbinary modeで*.txtを転送するなんて当たり前のことだろ。
330 名前:319 mailto:sage [2010/05/27(木) 08:19:39 ] >>326 16進数のASCII文字列を読み込んで、その内容をバイナリーでファイルに出力だ。 gets()して、それは捨てるって書いて無いよ。 デフォルトで使うだろうと予想してたけど。
331 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 08:43:08 ] >>319 だからきちんと問題書けよ。つーか、課題丸投げなんだろ。宿題スレに逝けよ。
332 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 23:13:26 ] >>330 問題文を短くしてgets()を使わなければ突っ込まれないと短絡的に考えたのだろうが あいにくURLエンコーディングには英数字の平文が混ざるので16進数ではないし 実装を比べるスレの趣旨からしてscanf()を指定する必然性も全くないし URLデコードは文字列から文字列への変換なんだからバイナリーとか発してる時点で馬科決定。 関数の使い方もコンピュータ用語も理解してないレベルで出題するなよ。
333 名前:デフォルトの名無しさん mailto:sage [2010/05/28(金) 00:32:43 ] #include <stdio.h> #define ENOUGH_LONG_LENGTH 24 int main(void) { char buf[ENOUGH_LONG_LENGTH]; FILE *fp; int miyazaki = 0xefBeadDe; strcpy(buf, "ef Be ad De"); fp = fopen("test.txt", "wb"); fwrite(&miyazaki, sizeof(int), 1, fp); fclose(fp); return 0; }
334 名前:デフォルトの名無しさん mailto:sage [2010/05/30(日) 10:54:03 ] お題 (次>>350 ) 文字コードに関係の無いURLデコード %と16進文字2桁を標準入力(コマンド引数、ファイル以外)から入力して、 バイナリーに変換し、test.txtファイルに落とす。 %の後に2桁の16進文字が続かない場合は、変換しないでそのまま出力する。 例: %Y %0X ⇒ 出力無し %Y0 ⇒ '0'出力 %00 ⇒ '\0'出力 %Aa01 ⇒ '\xaa' '0' '1'出力
335 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 09:13:37 ] >>281 日本語でオス #include <iostream> #include <vector> using std::cin; using std::cout; using std::endl; using std::vector; const int NUM_SIZE = 5; int main() { int i, temp = 0, sum = 0; vector<int> intContiner; cout << "5つ数を入力して下さい。" << endl; for( i = 0 ; i < NUM_SIZE ; ++i ) { // 上のfor文内でiを宣言するなら、sumやtempも移動すべき場所があるべきだろう。 cout << i + 1 << "番目入力" << endl; cin >> temp; intContiner.push_back( temp ); } cout << "5つ数の合計" << endl; vector<int>::iterator itr = intContiner.begin(); for( ; itr != intContiner.end() ; ++itr ) { sum += *itr; } cout << sum << endl; cout << "5つ数の平均" << endl; cout << sum / NUM_SIZE << endl; }
336 名前:デフォルトの名無しさん mailto:sage [2010/06/05(土) 17:16:25 ] >>335 >282
337 名前:デフォルトの名無しさん [2010/06/06(日) 15:00:48 ] 問題: ジョンにとって縁起のいい数字は4と7で, 他はどうでもいい.ラッキーナンバーとは, 縁起のいい数字を含んだ10進数である. 整数aとbが与えられたとき,aとbの間にあるラッキーナンバーの個数を挙げよ. オブジェクトの定義: クラス名 : TheLuckyNumbers メソッド名 : count 引数の型 : int,int 返値の型 : int メソッドの表記 : int count(ints,intb) として,公的メソッドとせよ. 注: aの値は1から1,000,000,000まで bの値は1から1,000,000,000まで TopCoderでグーグル先生に聞いたら出てきた問題を適当に張ってみる
338 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 19:38:26 ] a〜b=(1〜b)−(1〜a){a,b:a<b} ここまで分かった。
339 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 18:49:53 ] >>337 できたぞ #include <iostream> #include <cmath> using namespace std; class TheLuckyNumbers { public: int count(int s, int b); }; int TheLuckyNumbers::count(int s, int b) { int digits=0,temp; int k=0; if(s<1 || s > 1000000000 || b<1 || b > 1000000000) return 0; for(int i=s;i<=b;i++) { temp=i; while(temp){digits++;temp/=10;} temp=i; while(digits) { if(temp % 10 == 4 || temp % 10 == 7) k++; temp/=static_cast<int>(pow(10.0,digits)); digits--; } } return k; }
340 名前:339 [2010/06/12(土) 19:07:36 ] temp/=static_cast<int>(pow(10.0,digits)); digits--; じゃなくて temp/=static_cast<int>(pow(10.0,--digits)); だな。
341 名前:339 mailto:sage [2010/06/12(土) 19:25:34 ] 全然間違ってた while(digits) { if(temp % 10 == 4 || temp % 10 == 7) k++; temp/=10; digits--; } で最後だ
342 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 10:22:47 ] if(s<1 || s > 1000000000 || b<1 || b > 1000000000) return 0; は必要。 始めにdigitを求め無くても、tempを10で割って行ったら0になる、 そうするともっと早い修正になる。
343 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 10:55:40 ] >>341 7777とかだと一つの数字で+4されないか?
344 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 11:27:16 ] >>343 そうだな 7777→1個だな まぁすぐ直せるだろうけど
345 名前:344 mailto:sage [2010/06/13(日) 11:51:22 ] #include <iostream> using namespace std; class TheLuckyNumbers { public: int count(int s, int b); }; int TheLuckyNumbers::count(int s, int b) { if(s<1 || s > 1000000000 || b<1 || b > 1000000000) return 0; int digits=0,temp; int k=0; for(int i=s;i<=b;i++) { temp=i; while(temp) { if(temp % 10 == 4 || temp % 10 == 7){ k++; break;} temp/=10; } } return k; }
346 名前:342 mailto:sage [2010/06/13(日) 12:25:23 ] temp%10は2回やる必要なくてtmp=temp%10とかで、俺もやった。
347 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 13:13:26 ] Javaで貼ってもよかとですか?
348 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 13:24:40 ] >>347 リンクならOK 本体は pc12.2ch.net/test/read.cgi/tech/1268003943/l1
349 名前:347 mailto:sage [2010/06/13(日) 13:33:56 ] ほい pc12.2ch.net/test/read.cgi/tech/1268003943/674
350 名前:348じゃばじんすげえ mailto:sage [2010/06/13(日) 14:47:13 ] class TheLuckyNumbers { public: inline static int count(int a, int b) { if (a < 1 || a > 1000000000 || b < 1 || b > 1000000000 || a > b) return 0; return count(b) - count(a - 1); } private: inline static int count(int a) { int result = 0, digits/*=0*/, add = 0; if ((digits = search(a)) != 0) { result = a % digits; a -= result; result += 1; } digits = 1; while (a != 0) { for (int i = 0, j = a % 10; i < j; i++) { result += (i == 4 || i == 7) ? digits : add; } a /= 10; add = add * 8 + digits * 2; digits *= 10; } return result; } private: inline static int search(int a) { int result = 0; for (int digits = 1; a != 0; digits *= 10, a /= 10) { if (a % 10 == 4 || a % 10 == 7) { result = digits; } } return result; } };
351 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 00:35:58 ] >>350 コメントくらい書こうぜ。 つーか、問題文にはsの方がbより小さいとは書いてないみたいだけれど。 >>337 再帰でやってみた。 codepad.org/3FZQcU4D