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