No.8ベストアンサー
- 回答日時:
> ここで、今日ヒントが出たのですが、次のプログラムを参考にして(1)をやってくださいとのことでした。
なんてぇ補足 (^^;
要するに、再帰を使え、とのことかな?
#include <iostream.h>
void sum(int x, int xx[], int n)
{
int i, s;
for (i = 0, s = 0 ; i < n ; ++i)
s += xx[i];
if (s == x) {
for (i = 0 ; i < n ; ++i)
cout << " " << xx[i];
cout << endl;
return;
}
for (i = 1 ; i <= x - s ; ++i) {
xx[n] = i;
sum(x, xx, n + 1);
}
}
int main()
{
int x;
cout << "sum:";
cin >> x;
int xx[10];
sum(x, xx, 0);
return 0;
}
たいして分かり易くなったわけではありませんね。
■以下、余談
honiyon> 学校の課題ですよね?これ
honiyon> 他力本願な姿勢であると誤解されてしまいますよ
最初から、質問のタイトルに「課題」と入っているのだし、
質問サイトの本質は、他社の知恵におすがりしよう、というのだから
自分で何をしていようがかまわんとは思います。ただ、
> スマソ。
2ch なんか見ている暇があったら、テキストや参考書を開きましょう :-)
とは言うものの、あのソースを参考に、っていうのも辛いものが
ありますね。
念の為、最後に書いておきますけど、私が提示しているソースは
全部 c++ なので、多分、そのまま課題には使えないと思いますよ。
No.5
- 回答日時:
試しに力ずくで求めるプログラムを書いてみたら、重大な欠点(後述)が
あって、却って簡単にならないのね。
というわけで、1)もやってみました。
#include <iostream.h>
int main()
{
int x, n;
cout << "sum:";
cin >> x;
n = 1 << (x-1);
for (int i = 0 ; i < n ; ++i) {
for (int j = 0, a = 1 ; j < x ; ++j) {
if ((1 << j) & i) {
++a;
} else {
cout << " " << a;
a = 1;
}
}
cout << endl;
}
return 0;
}
「和」を指定できるように作ってみた(31までだけど)。4を指定した
ときの出力は
% wa
sum:4
1 1 1 1
2 1 1
1 2 1
3 1
1 1 2
2 2
1 3
4
って感じ。ソースだけ読んでも理屈が分からないと思うので、ちょっと
解説を。
例えば、和が4のときの自然数の列は、全て、1を基準に考えられる。
図示してみると、
1 2 1 → 1 1+1 1
3 1 → 1+1+1 1
という感じ。
つまり、4つ並んだ1のそれぞれの隙間を+で表現して、ひとつの数値と
見るか、空白で区切って別の数値としてみるか。
先に提示したプログラムでは、その隙間をビット表現として1ならば
+、0ならば空白だと思って、隙間の組み合わせ(4なら2の3乗)だけ
繰り返してみています。
# 下手な説明だなあ (^^;
ちなみに、「力ずくで書けるから」と思っていたプログラムは、
#include <iostream.h>
int main()
{
int i,j,k,l;
for (i = 0 ; i <= 4 ; ++i)
for (j = 0 ; j <= 4 ; ++j)
for (k = 0 ; k <= 4 ; ++k)
for (l = 0 ; l <= 4 ; ++l)
if (i + j + k + l == 4) {
if (i != 0) cout << " " << i;
if (j != 0) cout << " " << j;
if (k != 0) cout << " " << k;
if (l != 0) cout << " " << l;
cout << endl;
}
return 0;
}
という感じのプログラム。動かしてみると分かるのだけれど、
組合わせのダブりが出てくるのだよね。例えば、1・1・2だけ
でも4回も出てくる。
ダブりをはじくように考えると、却って面倒なので、考え方から
見直してみたのが、最初に出したプログラムなの。
この回答への補足
ここで、今日ヒントが出たのですが、次のプログラムを参考にして(1)をやってく
ださいとのことでした。
例)和がw以下となる長さnの数列をすべて表示するためのプログラム
#include<stdio.h>
void abs_sum( int n, int w);
int main()
{
int w =2,n =3;
abs_sum( n, w);
return 0;
}
void abs_sum( int n, int w)
{
void in_abs_sum( int total_length, int n, int w);
in_abs_sum( n,0,w);
}
void in_abs_sum( int total_length, int pos, int w)
{
int i, j, called =0;
if ( pos >= total_length ){
putchar( '\n');
return;
}
for ( i =0;i <= w;++i){
if ( called++ ){
for ( j =0;j < pos;++j){
printf(" ");
}
}
printf("%2d",i);
in_abs_sum( total_length, pos +1,w-i);
}
}
出力したらこうなりました。
0 0 0
1
2
1 0
1
2 0
1 0 0
1
1 0
2 0 0
Press any key to continue
No.4
- 回答日時:
> 1は・・・・そりゃあ~た4から1、2、3、って順番にひいいていけば
> いいでしょ?
「ぷっ」
1、2、1 や 1、1、1、1 も「和が一定(ここでは4)となる自然数の列」
なのよ。君もちゃんと授業に集中しなさいね :-)
どうせ、力ずくで求める解(ループが四重になっている奴)を書いてくるのが
いるだろうと思ってたのだけどなあ。
No.3
- 回答日時:
あんたもしかしてとーこーだいせい?
今日のドイツ語の授業中にそんな話してるやつらがいて・・・・・
横でそいつらの話聞いててぷっってわらってしまった・・・・
1は・・・・そりゃあ~た4から1、2、3、って順番にひいいていけば
いいでしょ?
#define kokodeha 4 //(笑)
for (int i=0;i<kokodeha;i++){
cout << i<<","<<kokodea-i<<endl;
}
2はwebで検索かけても、図書館に行ってもあるので省略(下にもあるし)
3)
再帰を用いるとスタックを食う(レポートに書くときは何に比例してって
書かないと点数がこないかも)
んで計算量はそんなには変わらないよね
No.2
- 回答日時:
1)は、つまらないのでパス。
2)は、こんな感じ(効率は、あまり良くないけど)。
#include <iostream.h>
int main()
{
int i = 2, x;
cout << "input n:";
cin >> x;
while (i <= x) {
if ((x % i) == 0) {
cout << " " << i;
x /= i;
} else {
++i;
}
}
cout << endl;
return 0;
}
3)の前に、再帰版のプログラムはこんな感じ。
include <iostream.h>
void pri(int x, int i)
{
if (x <= 1) return;
if ((x % i) == 0) {
cout << " " << i;
pri(x / i, i);
} else {
pri(x, i+1);
}
return;
}
int main()
{
int x;
cout << "input n:";
cin >> x;
pri(x, 2);
cout << endl;
return 0;
}
はっきり言って、(この程度のプログラムでは)たいした違いはない、よね。
再帰を使ったからといって、ロジックの見通しが良くなっているわけでも
無いし、却ってメモリ(スタック)を無駄に食うだけ。
あくまでもソフト屋さんの視点での比較なので、学校のレポートで点数を
もらえる保証は無いよ ;-)
# と言う意味では、「自信あり」とするわけにはいかないか…
No.1
- 回答日時:
こんにちは、honiyonです。
どの辺が分からないのですか?
プログラミングなのか、コーディングなのか。 ナドナド。
また、3番に関しては他人に検討を依頼するならば、まずは自分の意見を記述し、「皆さんはどう思いますか?」を問いかけるのが筋だと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
rand()の乱数は何故良くないの?
-
intとlongは同じ?
-
条件が多い場合
-
再起呼び出しの回数をカウント...
-
argvのNULLチェック
-
C言語 エラーの原因がわからな...
-
プログラミング初心者です。 Py...
-
2÷3などの余りについて
-
複数桁10進数の*桁目だけを抽出...
-
Enterキーを押されたら次の処理...
-
信頼区間の1.96や1.65ってどこ...
-
ある商品のロス率を5%見込み、...
-
変数とパラメータとは違うもの...
-
EXCELの分散分析表のP-値が....
-
C言語での引数の省略方法
-
「Aに対するBの割合」と「Aに対...
-
マイナスからプラスへ転じた時...
-
コマンドプロンプトがすぐ消える
-
プログラムでの数字につく”f”の...
-
Cで「大文字、小文字の判定」は...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
再起呼び出しの回数をカウント...
-
C言語で%を使わない余りの出し方
-
カードシャッフルのブログラム...
-
OpenCVによる4値化について
-
C++で表を作成したいのです ...
-
分数の足し算をさせるプログラ...
-
条件が多い場合
-
画像の拡大・縮小
-
ヌメロンのプログラム
-
C言語で簡単なパックマンゲーム...
-
関数とビット列
-
C++ bmp 透過処理
-
コマンドプロンプトのウィンド...
-
3のつく数と3の倍数を表示 C言語
-
異なるn個の整数からr個の整数...
-
迷路を脱出する経路探索プログ...
-
whileとifを使い偶数を出すには
-
再帰処理をループ処理に変換
おすすめ情報