
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(プログラミング・Web制作) パイソンのプログラミングについての質問です 2 2023/05/22 12:39
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- 数学 整数問題 11 素数再びの再び 36 2023/04/29 14:59
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2の補数を計算するプログラム
-
intとlongは同じ?
-
関数とビット列
-
【C#】SQL文の中に変数を埋め込...
-
c言語8クイーン問題が分かりません
-
分数の足し算をさせるプログラ...
-
C言語で簡単なパックマンゲーム...
-
C++ bmp 透過処理
-
ライントレース:C言語 物理セン...
-
opencvとmbedのシリアル通信で...
-
DXライブラリによるパズルゲー...
-
画面に文字を表示
-
C言語のプログラムについて(...
-
直線補間について
-
再起呼び出しの回数をカウント...
-
unsigned int に0xffffffを代入...
-
C言語で%を使わない余りの出し方
-
C++で表を作成したいのです ...
-
C言語で以下のようなプログラ...
-
以下のプログラムはOpenCVで画...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報