• ベストアンサー

C言語について質問です。このプログラムの作成方法

1から10の数字の隣と隣を引いた値を下に表示させるプログラムを作りたいです。 ただし使用する数字は同じ数字を使ってはいけない事。 上記のようなプログラムを作りたいのですが、for文とif文を使って作成可能でしょうか? ご指導お願いします。 数値=□ イメージ図   □  □  □  □     □  □  □       □  □         □

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.6

1)上から2段目のどこかに9が来て、 2)その上には(1, 10)あるいは(10, 1)が来る。 1)は3とおり。その各々に対して2)は2とおり。 つまり、1と9と10の置き方が6とおりあることになる。 これら以外の7個の数値の置き方は全部で7!=5040とおり。 よって、総当たり方式で調べる数は7!*6=30240とおり。 これくらいの数ならコンピューターは一瞬で求められるはず。 実際には、総当たりの途中で「これ以上先へ進んでもムダ」というケースが けっこうあるはずなので、本当に30240とおり全部を調べなくていいはず。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.5

あ~、よく考えたら、右から左を引くことを許さないと、 この問題は解けないわな。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

【ちょっとしたヒント2】 9 は 10-1 のケースだけですね。 さっきの【ちょっとしたヒント】で 10 は最上段に来ることがわかりましたので、 最上段とその下の段とで構成する3個の▽のうち、 どれか一つは 10 1  9 か 1 10  9 となります。後者は、右から左を引くことを許す場合。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

隣同士を引く、というのは、 左から右を引く 場合と 右から左を引く 場合とがあります。 今回のプログラムではどの場合を許しますか? 【ちょっとしたヒント】 隣同士を引いて10になることはあり得ませんね。 つまり、引き算の結果である、下向き▽の下の頂点には10は来ない、ということです。 ゆえに、10を置けるのは最上段に限られます。

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> 作成可能でしょうか? それは作成可能でしょう。 大きな問題は2つ (1)条件を満す数列をどうやって見付けるか (2)どうやって数列をイメージ図のように出力するか (2)の方は簡単。 テキストエデイタなり、方眼紙なりに、実際に見栄えよく書いてみればいい。 それで数字の前後の空白の数を数えれば法則がわかるはず。 あとは、その数になるように、forで空白を出力するとか、printfの書式を調節するとかすればよい。 (1)は難しいけど、やりだすと面白い。 一番単純な方法は総当たり。全部の組合せで条件を満すか調べればいい。 組合せをよく考えれば、「絶対不可能」なパターンもわかってくる。例えば、一番下の一つが決まれば、その上の2つは特定の組合せしか有り得ない。そういう不可能な組合せを早い段階で捨てていけば、総当たりに比べて格段の速度アップすると思う。 プログラムやってて面白いのは、やはりこういう、目に見える効果が出たときだと思う。

全文を見る
すると、全ての回答が全文表示されます。
  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

イメージ図の階層4階層で書かれてますが(あくまでイメージとしてなら別にかまわない) 与えられた条件でできるのはどう考えても3階層が限界ではないでしょうか (同一階層に同じ数字なら話が違う) 条件があいまいですが 出来るできないでいえばできるって答えになります ご指導ってのは プログラム例が欲しいって事? 自分で多少なり作ったコードなどは無いのでしょうか?  そういったものがあってこその指導は無いですか? 取りあえず2階層が成り立つコードを考えてみては? 3-2  1  でもいいわけですよね ※↑for分にするまでもなくなってしまうが

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語について質問です。このプログラムの作成方法

    以下のプログラムは隣の数を引いた値が下に行き、すべての数字が重ならないようにするプログラムです。完成したのは良いですが、凄く見にくいプログラムになってしまいました。 見やすいように修正箇所を教えて頂けますか? ttp://ideone.com/cJyaH

  • C言語の質問です

    #include <stdio.h> int main(void) { int stats[20], i, j; int mode, count, oldcount, oldmode; printf("20個の数字を入力してください: \n"); for(i=0; i<20; i++) scanf("%d", &stats[i]); oldcount = 0; /* モードを調べる */ for(i=0; i<20; i++) { mode = stats[i]; count = 1; /* この値の発生頻度を数える */ for(j=i+1; j<20; j++) if(mode==stats[j]) count++; /* 以前の数より多ければ、新しいモードを使用する */ if(count>oldcount) { oldmode = mode; oldcount = count; } } printf("モードは %d です\n", oldmode); return 0; } 上記のコードはユーザーに20個の数値を入力させ、 そのモード(最も頻繁に現れる数値)を調べて表示するプログラムです。 1番目のfor文までは分かります。そのあとが、どうしても分かりません!! 特に、oldcount = 0; とする所、count = 1; とする所、for文で j=i+1; とする所。 他、if文内が分かりません。 課題の丸投げではなく、本当に分からなくて困っています。 どなたか詳しく解説してくれないでしょうか?よろしくお願いします。

  • C言語についてなんですが

    プログラムの作成で分からないところがあります。 「二つの整数値を読み込み、小さいほうの数以上で大きい数以下の 整数を全て加えた値を表示するプログラムをdo文を使って 作成せよ。」 下の図のようにしたいです。 2つの整数を入力せよ。 整数A:37 整数B:28 28以上37以下の全整数の和は325です。 よろしくお願いします。

  • C言語のプログラムの質問です

    C言語で負の値が入力されたときに処理を終了する条件でキーボードから繰り返し入力するためにはどのようなプログラムにしたらいいですか? (FOR文を使い、FOR文の繰り返し条件を入れないで繰り返す)

  • C言語プログラムの課題

    大学で以下のような課題が出ました。でも全然わかりません。わかる方がいらっしゃったら、是非教えてほしいです★ 1整数値123を変数iに代入して、iの値を表示するプログラムを作成せよ。 2実数値3.14159を変数xに代入して、xの値を表示するプログラムを作成せよ。 3文字型せーた'A'を変数chに代入して、chの値を表示するプログラムを作成せよ。ただし、chの値を表示する際には、%d,%x,%cの書式を用いること。 4キーボードから入力された2つの整数値i,jの値を画面に表示するプログラムを作成せよ。 5キーボードから2つの整数値を、変数in1とin2に入力して、以下の計算をした結果を画面に表示するプログラムを作成せよ。 in1+in2= in1-in2= in1*in2= in1/in2= in1%in2=

  • C言語:forを用いたプログラム

    6時間格闘した結果皆さんに聞くことにさせていただきました; よければ回答、またはヒントを与えてくださるとうれしいです。 自然数nを入力すると,1からnまで出力するプログラムを,for文を用いて作成せよ.ただし,2の倍数の時は数値の右側に*を,3の倍数の時は数値の右側に#を表示させよ ちなみにまだまだ勉強足らない初心者です。

  • C言語のプログラムについて

    C言語初心者です if分を用いて aが2以上の場合には10 それ以外の場合にはbに100を代入して bの値を画面に表示するプログラムを作成したいです 書き方が分からないので 作成方法を教えていただきたいです よろしくお願いします

  • ガンマ変換 C言語でプログラムの作成

    次式のように、原画像の任意の階調値fから、点線の矢印のようにして交換後の階調値gを決める。このような階調値の変換を表す配列 unsigned char trans[256];を用いて画像の濃度補正を行うプログラム作成せよとあるのですが、どのような計算式を用いて任意の変換の プログラムを作成してよいかわかりません。 同、問題でガンマ変換のプログラムは作成したのですが、 詳しい方で添付画像のようなプログラムを作成できる方がいましたらよろしくお願いします。 ESPライブラリを使用していますので、添付ファイルにソースとヘッダファイルと図を添付しています   プログラムの開始: sを押す         終了: xを押す --------------------------------------------------------------*/ #include <stdio.h> #include <stdlib.h> #include "mypgmesp.h" /* ESP関係の関数が定義されているヘッダファイル */ #define FINAL_LEVEL 64 //最終的な表現階調数// // 関数のプロトタイプ宣言 void gamma_histgram(void); /*************************************************************************    このプログラムを実行したとき、はじめに実行される処理を書く *************************************************************************/ void ESP_Ready(void) { ESP_Open_Window(); } /*************************************************************************    このプログラムが終了したとき、実行される処理を書く *************************************************************************/ void ESP_Finish(void) { } /*************************************************************************    startボタンが押されたときに、実行される処理を書く *************************************************************************/ void ESP_Main(void) { int ret; /* 準備 */ ESP_Prepare(); /* 画像データを image1 に読み込んで表示する */ ret = ESP_load_image_data(); if(ret){ ESP_StartMenu(); return; } /////////////////////////////////////////////////// // 以下に関数や命令を記述する gamma_histgram(); // ここまで /////////////////////////////////////////////////// /* image2 を保存し表示する */ ESP_save_image_data(); /* メッセージの表示 */ ESP_StartMenu( ); } ////////////////////////////////////////////////// // 以下の関数内にプログラムを追加する /////////////////////////////////////////////////// void gamma_histgram(void) { int i, x, y,g; /* ループ変数 */ long int target_value;//変換後の頻度の目標値// double gam = 2.0,j; unsigned char trans[256]; ESP_Printf("ガンマ補正を行う\n"); for (i = 0; i < 256; i ++){ j=i; g=255*pow(j/255.0,1.0/gam); if(g>255) { trans[i]=255; } else if (g<0) { trans[i]=0; } else { trans[i]=(unsigned char)g; } x_size2=x_size1; y_size2=y_size1; for ( y = 0; y < y_size2; y ++ ) { for ( x = 0; x < x_size2; x ++ ) image2[y][x] = trans[image1[y][x]]; } } }

  • C言語のプログラム(ポインタについて)

    /* コマンドライン引数で与えられた長い文字列を長さ10文字ずつに分割してp[100][11]に順番に入れ,表示するプログラム <例>./a.out 1234567890ABCDEFG p[1] = "1234567890" p[2] = "ABCDEFG" */ #include <stdio.h> int main(int argc, char **argv) { int i, len; char *str; len=0; for(i=1; i<argc; i++){ len += strlen(argv[i]); } if((str=(char *) malloc(len+1))==NULL){ perror("malloc"); exit(1); } strncpy(str,argv[1],10); for(i=2; i<argc; i++){ strcat(str,argv[i]); } printf("p[%d] = %s\n", i-1, str); } 上に示した処理をするプログラムを作成したいのですが、 今のソースは単に10文字表示するだけで、ここからどうしたらいいのか見当がつきません・・・・・。 なのでどういった改良をすればよいのか教えていただければ助かります。 /*配列aにファイルから値を読み込み、それを表示した後*/ /*配列に格納された値を下に1つずつずらして表示するプログラム(ポインタを使用して)を作成*/ /*(なお、一番上a[0]にはa[99]の値を入れる)*/ /*<例>*/ /*a[0] = 0 */ /*a[1] = 1 */ /*  ・ */ /*  ・ */ /*a[98] = 98*/ /*a[99] = 99*/ /*a[0] = 99 */ 1つずらしたもの /*a[1] = 0 */ /*  ・ */ /*  ・ */ /*a[98] = 97*/ /*a[99] = 98*/ (読み込むファイル[file-100.dat]には0~99の数字が1つずつ改行しながら入っています) できればこちらにも答えていただければ嬉しいです。 この問のソースは書きませんが、ファイルを配列に読み込んで表示してからの処理がいまいちわからず困っています。 すばやい御回答お待ちしております。よろしくお願いします。

  • C言語!教えてください!

    /* キーボードから4桁の数字を読み込み、3で割った余りが0ならばそのまま  表示する。1ならば数字と並びを逆に表示する。  2ならばその数字と逆に並べた数字の差の絶対値を表示。その際に差が0  であるなら入力した数字をそのまま表示するプログラム。 */ #include <stdio.h> int main(void) { int no; printf("4桁の数字を入力してください:"); scanf("%d",&no); if(no % 3 ==0) printf("%d \n" , no); else if(no % 3 ==1) do{ printf("%d",no%10); no = no / 10; }while (no > 0 ); else ここから絶対値を考えようとしたのですが 逆にした値が文字で置かれていないのでやりようがありません。 逆にした値は文字で置けるものなんですか? それともこの文ではできませんか? よろしくお願いします。

突然印刷ができなくなった
このQ&Aのポイント
  • 普通に印刷していたが、突然印刷ができなくなった。困っている。
  • 印刷できない問題が発生し、対処方法がわからない。困っている。
  • Ew-052Aを使用していたが、突然印刷ができなくなった。困っている。
回答を見る