C/C++の宿題を片付けます 80代目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/12/24(日) 23:17:00【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
[3.1] OS: (Windows/Linux/等々)
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】
http://www.linux.or.jp/JM/index.html
【過去ログ検索】
http://chomework.sakura.ne.jp/
【wiki】
http://www23.atwiki.jp/homework/
【前スレ】
C/C++の宿題を片付けます 79代目
http://pc8.2ch.net/test/read.cgi/tech/1165943509/
0153デフォルトの名無しさん
2007/01/02(火) 11:56:42>>142
さすがにgets()はどうかと。
↓ぐらいにしとけや。
void get_string(char *p_str, int size)
{
int c, i;
for (i = 0; i < size-1 && (c = getchar()) != EOF && c != '\n'; ++i)
p_str[i] = c;
p_str[i] = '\0';
↓ぐらいにしとけや。
↓ぐらいにしとけや。
(c = getchar()) != EOF && c != '\n'; ++i
(c = getchar()) != EOF && c != '\n'; ++i
>入力範囲外まで無駄にコピー
意味不明。ちゃんと10文字で処理されてますが?w
とにかくうぜぇからバカじゃないって証明したいなら
お前がmainから書き出せ、以上。これ以上お前との言い合いは無意味。
お前がソースを書けば良いだけ。他人の粗探ししているくらいならやれ。
粗探しのつもりが自分の無知を晒すとはなw どこの三流以下の大学生だ?w
あっ、専門学校程度か、わりぃわりぃ、お前じゃ話にならねーかw
0154デフォルトの名無しさん
2007/01/02(火) 11:58:06のURL行ける?
0155デフォルトの名無しさん
2007/01/02(火) 11:58:08http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%83%B3
ぐらい読んどけ。Cプログラマの常識だから。
0156デフォルトの名無しさん
2007/01/02(火) 11:58:53お前のソースを書け、プログラマの常識だからw
0157デフォルトの名無しさん
2007/01/02(火) 11:59:04swap() に与える引数
たぶんx,yの要素全部入れ替えたいんだろからアドレスちゃんと渡さないと
0158デフォルトの名無しさん
2007/01/02(火) 12:00:07> swap(&x, &y);
swap(&x[i], &y[i]);
0159152
2007/01/02(火) 12:01:040160デフォルトの名無しさん
2007/01/02(火) 12:01:34ちゃんとそれを理解して言っているのか?
起こる場合の説明について
# ユーザが200文字以上のメールアドレスを入力する。
# プログラムがバッファの大きさをチェックせずに入力データを書き込む。
# バッファとして確保した領域をはみだしてデータが書き込まれてしまう。
比較するのに使う文字列を格納するs1、s2にはそれが起こらない措置をとっているが?
何のための char buf[256]を用意して文字列を10文字以内でコピーしているか理解しろよw
んじゃな、三流プログラマw
0161デフォルトの名無しさん
2007/01/02(火) 12:02:34>仮にはみ出した部分にプログラムの動作上意味を持つデータがあれば、
>これを上書きして破壊することにより、プログラムはユーザの意図しない挙動を示すであろう。
>>143で11文字以上入力するとおかしくなるんすけどぉ〜?
0162デフォルトの名無しさん
2007/01/02(火) 12:04:12えーとね。
試しに、256文字以上入力してみなよ。そうすりゃ分かるから。
君は256byteしかバッファを用意していないが、gets()はそんなことは
無関係にバファオーバーランを引き起こすのよ。
だから、危険な関数なの。
0163デフォルトの名無しさん
2007/01/02(火) 12:06:53何が「おかしく」なるのか言ってみそ?
少なくともバッファオーバーランは起きず、次回のget_string()で
続きの文字が読み取られるだけだろう?
「11文字以上入力された行については、残りの文字は全て破棄する」などという
仕様はどこにもないが、もしそうであれば、そのように書くのも簡単だ。
が、gets()だけはまずい。
0164デフォルトの名無しさん
2007/01/02(火) 12:08:07アホはアホでスルーしとけ
0165デフォルトの名無しさん
2007/01/02(火) 12:09:48何を指摘されてるのか、何が問題なのかもさっぱり理解もしてないし……
小学生か?>>142
0166デフォルトの名無しさん
2007/01/02(火) 12:14:24いや、何が問題かの指摘を分かっているかどうかはともかく
>>143が偉そうにレスした割には、ソース全部を書いていない他人の批判で
なおかつそのソースが不完全どころか自分がバッファオーバーランをする
ソースを書いているのが笑えるw
お前が幼稚園以下の知能の低いサルだなw
悔しかったら自分で書いたソースを出せよ?プログラマの常識だろ?w
0167デフォルトの名無しさん
2007/01/02(火) 12:15:45えーと、君、バッファオーバーランの意味分かってるのか?
>>143のソースではバッファオーバーランは発生しないのだが。
0168デフォルトの名無しさん
2007/01/02(火) 12:15:55>試しに、256文字以上入力してみなよ
bufに問題が起こるのはわかっているが、それを指摘する前に
お前がちゃんとソースを書けよ?うざいんだよ、このスレの趣旨分かってねーだろ?
ここは他人のソースを批判しにくるスレじゃない。ごちゃごちゃ言うまえに
てめぇ正しいソースを書いてから一蹴しろ?
お前のやっていることは、他人の落ち度を 自分基準 で言う割には
自分の基準もぐだぐだで、指摘したつもりがそれも間違っていて
恥さらしをしただけだな。とにかくごちゃごちゃ言ってないでお前の書いたソースを出せ、でなきゃ黙ってろ。
0169デフォルトの名無しさん
2007/01/02(火) 12:17:15いや、余裕でしているよ。11文字以上入力してみろよ?
256文字も打つ気しないなぁ。人間って間違えるからさ
10文字入力したつもりでも1文字くらい多く入力しちゃうこともあるんだよねw
まさか100文字以上も入力する奴いるかよ?w
あのCUIで?w笑える、一生文字入力してろ、知ったかの墓穴堀バカw
0170デフォルトの名無しさん
2007/01/02(火) 12:18:160171デフォルトの名無しさん
2007/01/02(火) 12:18:36大量の入力を与えるのはリダイレクトすれば簡単だけどな
0172デフォルトの名無しさん
2007/01/02(火) 12:19:24煽りまくってるのに、証拠は隠滅したのか>>142君はw
0173デフォルトの名無しさん
2007/01/02(火) 12:19:38バカです。自分が全部ソースを書けば良いだけじゃん。自分仕様のものを出せよ。
それはこれこれどういう問題があるから って話になってんだ?
現代において完璧なものがないから、何事も問題があることくらい分かってんだよ。
問題がなきゃ交通事故も犯罪も起こらない罠w
そこを人間の意志で問題を減らしていくことが必要なんじゃん。
お前みたいな問題を自分で起こす奴は社会に出てこないで檻の中に戻れよ、な?
0174デフォルトの名無しさん
2007/01/02(火) 12:20:33なんか必死ですね〜〜〜wwwww
お前のソースはここに残って、自分の間違い(バッファーオーバーラン)を
自分で指摘したのに自分が起こしていた証拠を残してしまうねw
とにかく必死だな、低学歴w
0175デフォルトの名無しさん
2007/01/02(火) 12:22:24それにオーバーランするなら、それをプリントスクリーンしてアップすればいいことじゃないの?
0176デフォルトの名無しさん
2007/01/02(火) 12:22:30void get_string(char *p_str, int size)
{
int c, i;
for (i = 0; i < size-1 && (c = getchar()) != EOF && c != '\n'; ++i)
p_str[i] = c;
p_str[i] = '\0';
}
> c != '\n';
なんすかこれ?(プ
0177デフォルトの名無しさん
2007/01/02(火) 12:23:41もとのソースが消失してるから訳和漢ね
0178デフォルトの名無しさん
2007/01/02(火) 12:23:590179デフォルトの名無しさん
2007/01/02(火) 12:24:32gets()がLinuxではタブーだと分かった以上出す必要ないだろ。
入力処理のライブラリを>>142に書き換えて提出しなさいw
11文字以上入力した場合、不具合が起こるから。256文字以内なら
オーバーランしないソースは洋ナシってことで、以後放置よろ。
0180デフォルトの名無しさん
2007/01/02(火) 12:25:37んじゃ、後はバッファオーバーランを指摘したのに自分で起こした
>>143がここを仕切るってことで、がんばれよ、墓穴堀さんw
0181デフォルトの名無しさん
2007/01/02(火) 12:29:27偉そうに言ってる割にはマジでカスだなww
0182デフォルトの名無しさん
2007/01/02(火) 12:31:23普通に使えばオーバーフローしないだろw
0183デフォルトの名無しさん
2007/01/02(火) 12:32:41どっちのソースも現状、mainから書いたのがすべて見れないのが
混乱させている気がする。レスだけ多くなる一方だいし。
0184143
2007/01/02(火) 12:38:15void get_string(char *p_str, int size)
{
int c, i;
again:
for (i = 0; i < size-1 && (c = getchar()) != EOF && c != '\n'; ++i)
p_str[i] = c;
p_str[i] = '\0';
if (c != EOF && c != '\n') {
if (getchar() != '\n') {
fprintf(stderr, "line too long. please input again\n");
while ((c = getchar()) != EOF && c != '\n')
;
goto again;
}
}
}
int main()
{
char buff[2][11];
get_string(buff[0], sizeof buff[0]);
get_string(buff[1], sizeof buff[1]);
printf("%s\n", strcmp(buff[0], buff[1]) ? "Not equal": "equal");
return 0;
}
0185143
2007/01/02(火) 12:39:10超親切仕様にしてやったぞ。
0186デフォルトの名無しさん
2007/01/02(火) 12:42:090187デフォルトの名無しさん
2007/01/02(火) 12:48:38きめぇソース書くなよ、最後まで粘着、しつこいお前が一番うぜぇ
このスレの趣旨が分かってないなら二度とくるな
ここはお前の絶対評価の場じゃないし、そのソースもきめぇ
うるさいのはむしろお前だから。ソースも書いてないくせに偉そうにして、馬鹿だろ。
>>124
>C1年生の初心者なので入門書レベルのコードでお願いします
分かったか?お前は肝心なものも忘れているんだよw
0188デフォルトの名無しさん
2007/01/02(火) 12:52:35>>185はいまとなっては見れない>>142のコードと違って、
・バッファオーバーランは発生しない
・10文字を超過する入力には再入力を促す
・標準関数はstdio.hの非常に基本的なものしか使っていない
(>>142はstring.hのものも使っていたな)
のだが。
>>185のどこが「入門書レベルのコード」を超過しているのかね?
0189デフォルトの名無しさん
2007/01/02(火) 12:53:11> >142の中に入れたときなんじゃねーの?w
だから最初っからmainも書いて出すべきだったろ?分かってないのはお前
0190デフォルトの名無しさん
2007/01/02(火) 12:55:09自分を自分で援護、擁護ですか?それが何か?
問題は>>184が間違っているってことじゃない。
最初っから書いていない奴が何批判を始めてんだと?
そこから間違っているから荒れたんだろ、お前もうぜぇ
0191デフォルトの名無しさん
2007/01/02(火) 12:55:42アンタが……
gets()の危険性も知らないなんて恥ずかしいよ。
0192デフォルトの名無しさん
2007/01/02(火) 12:56:24> 標準関数はstdio.hの非常に基本的なものしか使っていない
すいません、モロに strcmp を使っていて string.hがないという
コンパイルエラーが起きたんすけど・・・
0193デフォルトの名無しさん
2007/01/02(火) 12:57:14んがぁ!
失礼。全くその通り。
0194デフォルトの名無しさん
2007/01/02(火) 12:57:27し つ こ い お前も起こしたバッファーオーバーランを持ち出して
まだ自爆、墓穴堀を晒したいのかハゲw
0195デフォルトの名無しさん
2007/01/02(火) 12:58:28いやだから、起こさないでしょ。
>>143のコードでどうやって起こすの?
size引数に実際より小さな値を渡さない限りは起きないでしょ。
0196結局最後までエラーを残す自己厨な冬厨哀れ
2007/01/02(火) 12:58:47> printf("%s\n", strcmp(buff[0], buff[1]) ? "Not equal": "equal");
Call to function 'strcmp' with no prototype in function main
0197デフォルトの名無しさん
2007/01/02(火) 13:00:03C89なら、警告は出るかもしらんが、コンパイルは出来るはずだけど。
まぁ、俺が悪かったよ。
0198デフォルトの名無しさん
2007/01/02(火) 13:03:46もっとも、他人のソースの批判をする場所じゃないから、ここ。
ぐだぐだいちゃもんつける前に、自分がソースを書いて自分がとった手段を明確に
示せば良いだけ。出さない奴は卑怯者。そう、>>143みたいに結局mainを出さずに
その後、議論になった10文字より多かった場合のトラブルを他人に指摘されて
直しただけではだめってこと。
0199デフォルトの名無しさん
2007/01/02(火) 13:13:25ネタでもつまんね
0200デフォルトの名無しさん
2007/01/02(火) 13:14:47他にいままだ残っている宿題ってなんかあった?
0201デフォルトの名無しさん
2007/01/02(火) 13:16:21020287
2007/01/02(火) 13:34:1287お願い。
0203デフォルトの名無しさん
2007/01/02(火) 13:36:52[2] 問題文(含コード&リンク):
数列 a = [a_1, ..., a_n] が与えられる。ここから次の条件を
満たすような要素たちを効率よく選ぶプログラムを作れ。
条件 1. 隣り合う要素は選ばない。
条件 2.選んだ要素の総和が最大になる。
例: a = [1,3,3,2] のときは2つ目の3と4つ目の2を選ぶ(合計5)。
[3] 環境
[3.1,3.2] OS、コンパイラ: 問わず
[3.3] 言語: どちらでも可
[4] 期限: 1月4日
[5] その他の制限: 特になし
0204130
2007/01/02(火) 13:42:47142はもう消えているみたいだしどれを参考にすればよいのでしょうか?
書き忘れましたがコーディング規約でgetsとscanfは使わずに
fgetsとgetcharで作るように書かれてます。
0205デフォルトの名無しさん
2007/01/02(火) 13:43:59>>184にstring.hを追加して使えばおk
0206デフォルトの名無しさん
2007/01/02(火) 14:09:33void get_string(char *p_str, int size){
fgets(p_str,size,stdin);
while(*p_str) p_str++;
p_str--;
if(*p_str=='\n') *p_str = '\0';
else fflush(stdin);}
0207デフォルトの名無しさん
2007/01/02(火) 14:14:15stdinに対するfflush()の挙動は処理系依存だというのに
なんでこうも使いたがる奴が多いのか
0208デフォルトの名無しさん
2007/01/02(火) 14:29:45だからうざいって、お前はひっこんでろ。
他人の批判をする前に自分のソースを出せつっただろ?
0209デフォルトの名無しさん
2007/01/02(火) 14:40:40規定された方法が無いんだから仕方ないんじゃ。
rewind(stdin)もfseek(stdin,0,SEEK_SET)も出来る処理系はあるけど
動作が保障されてるやり方じゃない。
0210デフォルトの名無しさん
2007/01/02(火) 14:40:58だから、>>205でいいのでは?
0211デフォルトの名無しさん
2007/01/02(火) 14:45:40stdioのバッファを空にしたいというよりは、単に行末まで
読み飛ばしたいだけなんだから、いくらでも方法はあるはずだが。
scanf("%*[^\n]%*c");
でもいいし、
scanf()を使わないなら、>>205のやりかたでもいい。
0212デフォルトの名無しさん
2007/01/02(火) 14:55:53文字の入力受付はこうとか、ありきたりなソートに比較回数、交換回数を数えるものとか
そういったところまでありきたりなものが書かれたやつとか
0213デフォルトの名無しさん
2007/01/02(火) 15:04:17ここは丸投げスレだし、必要無いんじゃないかな?
丸投げでない人へは、俺に聞けスレへの誘導だけで良いと思う。
0214デフォルトの名無しさん
2007/01/02(火) 15:16:260215デフォルトの名無しさん
2007/01/02(火) 15:46:290216デフォルトの名無しさん
2007/01/02(火) 17:04:56難しいな。それなりに枝は刈ったつもりだけど、10x10 程度でも
下みたいに選択肢は多いのにクリア不能の盤面がきつい。
(ずれるので等幅フォントで見てください)
@......#.#
.......#..
....#####.
..........
..........
..........
..........
..........
..........
..........
0217デフォルトの名無しさん
2007/01/02(火) 17:12:59wikiがあるからぜひそこに書き記してくれ
0218デフォルトの名無しさん
2007/01/02(火) 18:25:200219デフォルトの名無しさん
2007/01/02(火) 18:33:450220デフォルトの名無しさん
2007/01/02(火) 18:56:50完全って証明できるの?
0221デフォルトの名無しさん
2007/01/02(火) 19:03:090222デフォルトの名無しさん
2007/01/02(火) 19:22:00これはグラフが相当制限されているが、それでも >>133 にあるように NP 完全。
証明は平面グラフのハミルトン閉路に帰着して行う。ただし、それほど簡単ではない。
0223デフォルトの名無しさん
2007/01/02(火) 19:41:33そんな宿題でるか普通?
0224デフォルトの名無しさん
2007/01/02(火) 20:23:53ハミルトン路の問題と、ハミルトン閉路の問題で違いが出たりはしないの?
0225デフォルトの名無しさん
2007/01/02(火) 21:26:49[2] 問題文(含コード&リンク):
0〜255の整数を入力し、数値に変換してunsigned char型変数に格納。
この数値に対し1ビット左にシフトした結果と1ビット右にシフトした結果
全ビット反転した結果をそれぞれ2進、10進、16進で表示。
<出力例>255と入力した場合
整数を入力 (0−255): 255
処理前 255 ff 11111111
右シフト 254 fe 11111110
左シフト 127 7f 01111111
全ビット反転 0 00 00000000
(エラー処理)
範囲外の整数、'0'〜'9'以外の入力 エラーメッセージ表示
改行のみ エラーメッセージ表示
[3] 環境
[3.1] OS: (Windows)
[3.2] コンパイラ名とバージョン: (gcc )
[3.3] 言語: (C)
[4] 期限: なし
[5] その他の制限:
よろしくお願いします
0226デフォルトの名無しさん
2007/01/02(火) 21:34:36各ステップで立方体の体積を計算し、
その体積が初めて100を超えたときに
一辺の長さと体積を表示するプログラムを作成しなさい。
このプログラムでは一辺の長さの初期値と刻み幅を
キー入力で与えるようにすること。
結果表示の例)
刻み幅=0.01
辺の長さ=4.65 体積=100.545
この問題わかる方いますかぁ??
学校で始めたばかりなんですが、
全然わかりません。。。
よろしくお願いします。
0227デフォルトの名無しさん
2007/01/02(火) 21:40:52>>1読んで書き直し
0228デフォルトの名無しさん
2007/01/02(火) 21:58:33ハミルトン路問題とハミルトン閉路問題の変換は容易.
以下 G = (V, E) を固定する.
ハミルトン路問題をハミルトン閉路問題に帰着する:
新しい頂点 s を G に追加し,二頂点 u, v ∈ V を取って
辺 (u,s) と (s,v) を張る.G ∪ {s} にハミルトン閉路があれば
G に u-v 間を繋ぐハミルトン路がある.これを任意の u, v
について行えば, G にハミルトン路があるかどうか判定できる.
ハミルトン閉路をハミルトン路に帰着する:
新しい頂点 s, t を G に追加し,隣接する二頂点 u, v ∈ V を取って
辺 (s,u) と (v,t) を張る.G ∪ {s,t} にハミルトン路があれば
それは s を始点にし,t を終点にするものに限る.この路を用いると
u から出て v に行き,u に戻るようなハミルトン閉路が構成できる.
これを任意の u, v について行えば,ハミルトン閉路があるかどうか判定できる.
どっちの構成も図を描けばやりたいことは分かるとおもう.
0229デフォルトの名無しさん
2007/01/02(火) 22:38:10http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3306.c
0230デフォルトの名無しさん
2007/01/02(火) 22:47:41数字の後に数字以外を入力しても正しく入力されたことになっちゃうよ。
0231デフォルトの名無しさん
2007/01/02(火) 22:50:22そういう仕様でなんら問題ないよ。むしろそういう入力をする方がどうかと。
atoiも数字以外の英数文字があってもそれを無視して先頭の数字を
数値として認識するし、そういうもんだと割り切れば良いだけ。
0232デフォルトの名無しさん
2007/01/02(火) 22:52:30>>225 >>229を修正版
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3307.c
0233デフォルトの名無しさん
2007/01/02(火) 23:02:38[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3308.txt
[3] 環境
[3.1] OS: (Windows)
[3.2] コンパイラ名とバージョン: (Visuai Studio 2003)
[3.3] 言語: (C)
[4] 期限: 1月9日
[5] その他の制限: よろしく願いします。
0234デフォルトの名無しさん
2007/01/02(火) 23:12:44あー、ちょっと点を加えると相互の問題に変換できるのか
図に描いてみて把握した。タメになった�dクス
0235112
2007/01/02(火) 23:35:19また何かありましたら、よろしくお願いします。。。
0236デフォルトの名無しさん
2007/01/03(水) 00:28:05[2] 問題文(含コード&リンク): 一辺の長さを適当な刻み幅で増加させて
各ステップで立方体の体積を計算し、
その体積が初めて100を超えたときに
一辺の長さと体積を表示するプログラムを作成しなさい。
このプログラムでは一辺の長さの初期値と刻み幅を
キー入力で与えるようにすること。
結果表示の例)
刻み幅=0.01
辺の長さ=4.65 体積=100.545
[3] 環境
[3.1] OS: (Windows)
[3.2] コンパイラ名とバージョン: (Visuai Studio 2003)
[3.3] 言語: (C)
[4] 期限: ([2007年1月9日まで]
お願いします。
0237デフォルトの名無しさん
2007/01/03(水) 00:47:42#include<stdio.h>
#define THRESHOLD 100.0
int main(void)
{
double length, step, volume;
printf("辺の長さを入力して下さい :");
scanf("%lf", &length);
printf("刻み幅を入力して下さい :");
scanf("%lf", &step);
if(length<=0.0 || step<=0.0)
{
printf("Error: 正の数を入力して下さい\n");
return 1;
}
while(1)
{
volume=length*length*length;
if(volume>THRESHOLD)
break;
length+=step;
}
printf("刻み幅=%f\n辺の長さ=%f 体積=%f\n", step, length, volume);
return 0;
}
0238デフォルトの名無しさん
2007/01/03(水) 00:51:41023987
2007/01/03(水) 01:08:22とりあえず、探索の方法だけでもヒントがいただければ…
10×10程度ができれば大丈夫みたいです…すいません。
0240デフォルトの名無しさん
2007/01/03(水) 01:21:45http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3309.c
0241デフォルトの名無しさん
2007/01/03(水) 02:00:41本当にありがとうございます。助かりました。
0242デフォルトの名無しさん
2007/01/03(水) 02:45:13例えば今回の場合、各マスは上下左右4方向に繋がっていて、入ってきた
方向へは動けないので、各マスごとに最大3方向から1方向を決定することになる。
仮に全マス数100(N=10)、通過できるマスが半数の50個の場合を考えると、
答えがないかどうかをチェックするために大雑把に3の50乗個の道を調べないと
いけない。これでは、もし1秒間に平均1億個の道をチェックできたとしても、
解決までに約2億年もかかる計算になる。
だから論理上正しいだけのプログラムを作ったところで、よほどNを小さくするとか
よほど易しい特別なパターンでない限り、答えを出したり
>条件を満たすものがない場合、できませんでした。と表示
したりはできない。
0243デフォルトの名無しさん
2007/01/03(水) 02:57:17lengthはdata[], select[]の長さで,返り値は最大の合計値.また,その合計値に
data[i]が使われればselect[i] = 1,使われなければselect[i] = 0がセットされる.
処理はΘ(n).
int solve(int data[], int length, int select[]) {
int i, p1, p2, p3, w; p1 = p2 = p3 = 0;
for (i=0; i<length; i++) {
if (p2 <= p3)
{ w = data[i] + p3; select[i] = i-3; }
else
{ w = data[i] + p2; select[i] = i-2; }
p3 = p2; p2 = p1; p1 = w; }
i = length-1;
if (p1 < p2) select[i--] = 0;
while (i >= 0) {
w = select[i];
select[i--] = 1;
while (i > w) select[i--] = 0; }
return p1 < p2? p2 : p1; }
0244デフォルトの名無しさん
2007/01/03(水) 07:00:58http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3310.c
10×10 でも解けない盤面があるので未完成だが.
現在やっていることは
1. ハッシュで既出盤面をチェック.
2. 白マスと黒マスの個数が違うとクリア不能.
3. 非連結のときはクリア不能.
4. 行き止まりが多すぎるとクリア不能.
今後の加速の方針としては,ハッシュ方法を見直すことと,
アドホックにクリア不能パターンを列挙して枝を刈ることがある.
*問題のサイズはプログラムに対して相当影響するので
適当なことを言うと参考にしづらいものしか出てこないよ.
0245デフォルトの名無しさん
2007/01/03(水) 09:17:17243では数値の範囲を自然数に限定してしまったので,実数まで拡張したものを載せときます.
引数,返り値,効率に関しては上と同じ.main関数はおまけ.
double solve(double data[], int length, int select[]) {
int i, ix, w; double p1, px, v;
p1 = px = 0.0; ix = -1;
for (i=0; i<length; i++) {
v = p1; p1 = px + data[i]; select[i] = ix;
if (v > px) { px = v; ix = i-1; } }
i = length-1;
if (px > p1) while (i > ix) select[i--] = 0;
while (i >= 0) {
w = select[i]; select[i--] = 1;
while (i > w) select[i--] = 0; }
return px > p1? px : p1; }
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 15
int main() {
srand(time(NULL));
int i, select[LENGTH];
double data[LENGTH];
printf("data :");
for (i=0; i<LENGTH; i++) {
data[i] = (double)rand()/RAND_MAX-0.3; printf("%5.2lf ", data[i]); }
printf("\nchoice:");
double max = solve(data, LENGTH, select);
for (i=0; i<LENGTH; i++) { printf("%5d ", select[i]); }
printf("\nmax: %3.2lf\n", max); }
0246デフォルトの名無しさん
2007/01/03(水) 10:17:54[2] 問題文(含コード&リンク):時間をdouble型に??時??分??秒.??ミリ秒として格納しているとして
二つのdoubleの差をミリ秒で求めるには?
[3] 環境ウィンドウズ
言語C++
例90004.45と85958.40だと答えは6000.5
9:00;04.45 8:59:58.40
なんですが1秒は1000ミリ秒でしたっけ?
100ミリ秒の気もするのですが、よろしくお願いします。
0247デフォルトの名無しさん
2007/01/03(水) 10:34:530248デフォルトの名無しさん
2007/01/03(水) 11:01:18>>>88-90
>のURL行ける?
見れませんでした?見れると思います。
>>215
>88却下。俺にはできん...
質問の仕方が悪かったですか?
(154さんと同じ方ですか?)
0249デフォルトの名無しさん
2007/01/03(水) 11:29:4290004.45と85958.40だと6050ミリ秒じゃないの?
0250デフォルトの名無しさん
2007/01/03(水) 12:27:08【問】
キーと値のペアを扱う、二分木クラスを自作せよ。std::map を参考にせよ。
下記のメンバ関数を実装せよ。
// 追加 - return: true: OK, false: NG(重複)
bool mymap::insert(int key, int val);
// 検索 - return: 見つかった key の val, 見つからない場合は、今のところは -1 で良い。
int mymap::find(int key);
// 削除 - return: true: OK, false NG(not found)
bool mymap::remove(int key);
// 表示 - 昇順
void mymap::print();
0251デフォルトの名無しさん
2007/01/03(水) 23:43:23[2] 問題文(含コード&リンク):
生年月日を入力させ、その人が何日生きたかを表示させるプログラムを書け。
(閏年も考慮すること)
[3] 環境
[3.1] OS:Windows XP
[3.2] コンパイラ名とバージョン: bcc32
[3.3] 言語: C
[4] 期限: 2007/01/08
[5] その他の制限: なし
0252デフォルトの名無しさん
2007/01/04(木) 00:58:42#include<stdio.h>
#include<time.h>
int main(void){
time_t birthday, current;
struct tm birthday_str={0,0,0};
int year, mon, mday;
printf("\n生年月日を入力して下さい\n");
printf("例. 2007 1 1 : ");
scanf("%d %d %d", &year, &mon, &mday);
year-=1900;
mon-=1;
birthday_str.tm_year=year;
birthday_str.tm_mon=mon;
birthday_str.tm_mday=mday;
birthday=mktime(&birthday_str);
time(¤t);
printf("生まれてから %d 日経ちました\n", (int)(difftime(current, birthday)/(60*60*24)));
return 0;
}
■ このスレッドは過去ログ倉庫に格納されています