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/
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