以下のコードを再帰を使わない方法でやるにはどうしたらいいですか?
※インデントは全角空白になっています。
#define N(n) (a[n]*100+a[n+1]*10+a[n+2])
#define R(n) (a[n+2]*100+a[n+1]*10+a[n])
char a[9];
void sub(int n)
{
int i;
char c;
if(n == 8){
if(N(0) + N(3) * N(6) == R(6) * R(3) + R(0))
printf("%d%d%d+%d%d%d×%d%d%d = %d%d%d×%d%d%d+%d%d%d\n",
a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8],
a[8], a[7], a[6], a[5], a[4], a[3], a[2], a[1], a[0]);
return;
}
for(i = n; i < 9; ++i){
c = a[i], a[i] = a[n], a[n] = c;
sub(n + 1);
c = a[i], a[i] = a[n], a[n] = c;
}
}
int main(void)
{
int i;
for(i = 0; i < 9; ++i)
a[i] = i + 1;
sub(0);
return 0;
}
No.2
- 回答日時:
再帰の除去を行うには、以下の方針で行うことになります。
* 関数 sub の中身を無限ループで囲む
* 変数 n や i などの値は、スタックに複数個を格納させる
* ループ内で使用する値はスタックの先頭(front)
* sub 内のループは排除して、無限ループに一本化する
* 再帰呼び出し(call)をスタックへの積み込み(push)に変更
* 再帰からの戻り(return)をスタックからの戻し(pop)に変更
ご提示のソースの場合、
sub(n+1) 後の戻し処理をどう行うかが肝となるでしょう。
No.3ベストアンサー
- 回答日時:
何をやろうとしているのかが、今ひとつ解読できないのですが。
こういうのは、言葉で説明していただくと助かるんですが。
単に1から9の9個の数字の順列で、
(1*100+2*10+3)*(4*100+5*10+6)+(7*100+8*10+9)
=(9*100+8*10+7)+(6*100+5*10+4)*(3*100+2*10+1)
である順列を列挙する、ではいけないのでしょうか。
int main(){
for(int a0 = 1; a0 <= 9; a0++){
a[0]=a0;
for(int a1 = 1; a1 <= 9; a1++){
if(a1==a[0])continue;
a[1]=a1;
for(int a2 = 1; a2 <= 9; a2++){
if(a2==a[0] || a2==a[1])continue;
a[2]=a2;
for(int a3 = 1; a3 <= 9; a3++){
if(a3==a[0] || a3==a[1] || a3==a[2])continue;
a[3]=a3;
for(int a4 = 1; a4 <= 9; a4++){
if(a4==a[0] || a4==a[1] || a4==a[2] || a4==a[3])continue;
a[4]=a4;
for(int a5 = 1; a5 <= 9; a5++){
if(a5==a[0] || a5==a[1] || a5==a[2] || a5==a[3] || a5==a[4])continue;
a[5]=a5;
for(int a6 = 1; a6 <= 9; a6++){
if(a6==a[0] || a6==a[1] || a6==a[2] || a6==a[3] || a6==a[4] || a6==a[5])continue;
a[6]=a6;
for(int a7 = 1; a7 <= 9; a7++){
if(a7==a[0] || a7==a[1] || a7==a[2] || a7==a[3] || a7==a[4] || a7==a[5] || a7==a[6])continue;
a[7]=a7;
for(int a8 = 1; a8 <= 9; a8++){
if(a8==a[0] || a8==a[1] || a8==a[2] || a8==a[3] || a8==a[4] || a8==a[5] || a8==a[6] || a8==a[7])continue;
a[8]=a8;
if(N(0) + N(3) * N(6) == R(6) * R(3) + R(0))
printf("%d%d%d+%d%d%d×%d%d%d = %d%d%d×%d%d%d+%d%d%d\n",
a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8],
a[8], a[7], a[6], a[5], a[4], a[3], a[2], a[1], a[0]);
} } } } } } } } }
}
9重ループです。
個々の添字ごとにすべての重複しない数字(0-9)を埋めます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
std::set<int> で、ある値が何...
-
C#のコンパイルエラーCS0120に...
-
Cでボリュームコントロールを制...
-
int16_t の _t は何?
-
C言語の関数で戻り値を返す必要...
-
fprintfでの文字化け
-
C言語での引数の省略方法
-
因数分解を行うプログラムについて
-
引数 戻り値 return文について
-
演算子オーバーロードのプログ...
-
atoi関数の自作
-
C言語での奇数の和
-
c言語 〇×ゲーム
-
プログラムのバグについて
-
C言語で分からないところがあり...
-
ColorをRGBで指定する方法
-
C言語の基礎 . 2乗値の差につ...
-
剰余演算を論理演算と加減算に...
-
クイックソートでの整列
-
c/c++でのファイルの上書き保存...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
AtCoderABC135の問題Cについて
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
ラップ関数とはどんなものですか?
-
if と配列の組み合わせ
-
return 1L
-
read関数をノンブロッキングで...
-
(int *)の意味
-
std::set<int> で、ある値が何...
-
Win32APIで作るコンボボックス...
-
C++でvectorにテキストファイル...
-
「{ } で囲むだけ」は正しい?
-
足して100になるような乱数のア...
-
Arduinoのプログラムにエラーが...
-
課題でつまってます・・・
おすすめ情報