#include<stdio.h>

int main()
{
int n;
int m;
int i;
int kumi;
int san;

printf("n:");
scanf("%d",&n);
printf("m:");
scanf("%d",&m);

for(kumi=1,i=n;i>n-m+1;i--){
kumi=kumi*i;
}
for(san=1,i=1;i<=m;i++){
san=san*i;

}


printf("%d個の中から%d個を取り出す組み合わせは%dとおり\n",n,m,kumi/san);

return 0;
}

組合わせの値がおかしいです。

A 回答 (3件)

2箇所気になる点があります。



1.最初のforループ
i=n~n-m+1までのm個についてこのループを実行するためには
for(i=n;i>n-m;i--)
でないといけません。tomo_ko_nさんのコードだと、i=n-m+1の場合はループが実行されません。

2.オーバーフローへの対処
nやmをある程度の数にすると簡単にオーバーフローします。
そのチェックはしておいたほうが良いでしょう。
#1にあるように掛け算と割り算を同じループ内で実行するとオーバーフローを起こしにくくなります。
また、m>n/2の場合は、m=n-mとしてから計算するとより速く計算できます。
    • good
    • 0
この回答へのお礼

わかりやすくてありがとうございました。

お礼日時:2009/05/28 19:37

「おかしい」とは「何がどのようにおかしい」のでしょうか?


具体的な例で, 「このような入力に対してこう期待されるのにこんなのが出てきた」と書いてみてください.
#1 は超能力者か?

この回答への補足

取り出す組み合わせは%dとおりの所です。
例えばn=5、m=3だと、10になるはずなのになりません。

補足日時:2009/05/28 19:32
    • good
    • 0

#include <stdio.h>



int main(void)
{
int combi, n, m, t, i;

do {
printf("n:"), scanf("%d", &n);
printf("m:"), scanf("%d", &m);
} while (n < m || m < 0);

for (combi = i = 1, t = n; i <= m; n--, i++) {
combi *= n;
combi /= i;
}
printf("%d個の中から%d個を取り出す組み合わせは%dとおり\n", t, m, combi);
return 0;
}
    • good
    • 0
この回答へのお礼

参考になるプログラムありがとうございました。

お礼日時:2009/05/28 19:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qプログラミング入門に最適な言語

プログラミング入門に最適な言語
最近プログラミングに興味をもって、プログラミングに挑戦しようと思ってます。

最終的にC++へ行くつもりですが、何の言語からはじめるのがいいでしょうか。
よろしくお願いします。

Aベストアンサー

議論百出だろうと思います。

「Cを身につけてからC++を学ぶべきである」
と言う人もいるでしょう。

私は、そうは思いません。
(Cをバイパスし)いきなりC++で構わないと思います。

プログラミングが全く未経験であれば、
やはりGUIで結果がグラフィカルに出た方が楽しいと思います。

有償になってしまいますが
MFCを搭載したVC++ Standerd以上をお勧めします。

また、別の方法として
多少回り道になりますが
C#という手もあります。

これなら無償のExpressでも十分にGUI制作が楽しめます。

まずは、プログラミングの楽しさ、醍醐味を味わってみてください。

入門書等についてですが
あなたが趣味でコツコツプログラミングをし、
出来たものを自分だけで使うのが目的なら
何でもいいです。

ただし、プログラムを公開する
(フリー、商用問わず)
また、ソースコード(一部でも)
(こういうサイトで質問の為に提示することを含む)
つもりがあるなら、

「きちんとした書籍」

で学ぶことをお勧めします。
「10日で・・・」
とかうたっている物の中には
「動けばいい!」
という姿勢で書かれたものが多く、
ソースコードが非常に読みにくいです。

読みやすいソースコードであれば
こういうサイトでも回答が付きやすいですが、
読みにくいソースコードは
分析に非常に時間がかかるので
回答がなかなかつきません。

また、読みやすいソースコードは
バージョンアップも簡単ですし、

一般に
(例外はありますが)
動作も早く、コンパクトです。

頑張ってください!!!

議論百出だろうと思います。

「Cを身につけてからC++を学ぶべきである」
と言う人もいるでしょう。

私は、そうは思いません。
(Cをバイパスし)いきなりC++で構わないと思います。

プログラミングが全く未経験であれば、
やはりGUIで結果がグラフィカルに出た方が楽しいと思います。

有償になってしまいますが
MFCを搭載したVC++ Standerd以上をお勧めします。

また、別の方法として
多少回り道になりますが
C#という手もあります。

これなら無償のExpressでも十分にGUI制作が楽しめま...続きを読む

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Qコンピュータープログラミング入門の本

コンピュータープログラミングを独学で学びたいと思ってます。
どのようなことがやりたいか一概にいえませんが、当面はHPを好き勝手に作れるようになったり、ある程度プログラミングが理解できるようになりたいと思ってます。
入門の本(解りやすく飽きさせない、ある程度網羅できる)
という本はないでしょうか??
お願いします。

Aベストアンサー

還暦まじかのじっちゃまです。
服飾デザイナでプログラマではありませんので参考程度に。

さて、数年前に「人もすなるHPとやらを我も」と思い立ちました。
まず、やったことは、HTMLとCSSとに関するW3Cの勧告の日本語訳のダウンロードと印刷。
脇に揃えた参考書は2冊です。

「プログラミング言語C第2版」(カーニハン&リッチー著)
「Web標準の教科書」(益子貴寛著)

HP作成の入門書は数あれど、所詮は、W3Cの勧告をあちこち抜粋したもの。
ですから、W3C勧告の入手をお勧めします。

「プログラミング言語C第2版」は、JavaScript の習得のためです。
同著の例文をJavaScriptで書けるようになれば、ほぼ、同言語の文法的なマスターは終了。
「プログラミング言語C第2版」は、かなり古いです。
だが、その例文の再現は、プログラミングの習得にもなり一石二鳥じゃないですかね。
かなり、プログラミングに関する基本的なことが学べますよ。

「Web標準の教科書」は、「XHTMLとCSSでサイトをつくる」上では大変に参考になりました。

なお、プログラミングの独学の成否は、入門書ではなくヘルプ文のみで壁を突破できるか否か。
還暦まじかのじっちゃまは、このように思いますよ。

還暦まじかのじっちゃまです。
服飾デザイナでプログラマではありませんので参考程度に。

さて、数年前に「人もすなるHPとやらを我も」と思い立ちました。
まず、やったことは、HTMLとCSSとに関するW3Cの勧告の日本語訳のダウンロードと印刷。
脇に揃えた参考書は2冊です。

「プログラミング言語C第2版」(カーニハン&リッチー著)
「Web標準の教科書」(益子貴寛著)

HP作成の入門書は数あれど、所詮は、W3Cの勧告をあちこち抜粋したもの。
ですから、W3C勧告の入手をお勧めします。

「プログ...続きを読む

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Qプログラミング入門

プログラミング入門
今、私はプログラミングの勉強をしたいなーと思っています。それでホント初心者でも一からできるソフトはないでしょうか?または詳しく乗っているサイトを教えてください<m(__)m>
できればJAVAかCがいいです

Aベストアンサー

こういうのって人それぞれだと思いますが^^;

とりあえず、私は

http://wisdom.sakura.ne.jp/

このサイトで育ちました。

これから始めると言うのであれば開発環境が整っている言語が楽だと思うので

フリーならば

eclipseでjava

http://www.javadrive.jp/eclipse3/

hsp

http://hsp.tv/

フリーじゃないならば

visual studioをつかってVBやc言語

もしくは#1さんがおっしゃられているようにVBAあたりでしょうか

Qprintf( "%d", i % 10 );で?

int count;
int i;
scanf( "%d", &count );
for( i = 0 ; i < count ; i++ )
printf( "%d", i % 10 );「iを10で割った余り」だそうです。
i%5とした場合、 
 仮に5と入力すれば、01234と表示すると思いますが、
何でiを5で割れば5進数みたいにコンピュータが認識するのですか?
理論だけ勉強中で、実際試したことがありません? 
よろしくお願いします。

Aベストアンサー

例えば、246を例に考えてみます。

246を5で割ると49で余りが1

これは書き換えると
246 = 49x5 + 1 という事ですね。

次に49について同様に行なうと
49を5で割ると9で余りが4

これは書き換えると
49 = 9x5 + 4という事ですね。

最初の結果とあわせると、
246 = 9(x5x5) + 4(x5) + 1
という事ですね。

同様に9についても計算すると

246 = 1(x5x5x5) + 4(x5x5) + 4(x5) + 1

となります。


5で割った答えと5で割った余りは、5進数で一つ上の桁へ移せる部分とその桁に残る部分を分けている事になります。
10進数でも32を考えた時、30の部分は上の桁に移せる部分で(10で割った答え部分)2はその桁に残る部分(2 = 32 % 10)ですよね。

Qデバイスドライバのプログラミングでおすすめの入門本

Deamon Toolのような仮想マウントソフトを作りたいと考えています。
そこで、いろいろ調べているとWindows Device Kit(WDK)を使ってプログラミングをする必要があることが分かりました。

実際、この種のプログラミング本は少ないようで、おすすめの入門者が読めそうな本があれば教えてください。
ちなみに、C/C++言語の知識はあります。

Aベストアンサー

Windows Driver Kitには、サンプルコードとドキュメントが含まれています。

通常のWindowsアプリケーションを作成できる技量がある技術者であれば、サンプルコードとドキュメントが入門書の代わりになります。

通常のWindowsアプリケーションを作成できる技量がないのであれば、たとえ入門書があっても、読んでて内容が理解できないでしょうし、サンプルコードとドキュメントを見ても意味不明でしょう。

そういう訳で「入門書が要らない」ので「入門書がない」のです。

まずは、Windows Driver Kitのインストールセットを入手し、インストールしましょう。

Qint i, int i[1];

C++で、
 int i;
と、
 int i[1];
は、どっちで宣言をしても、iは同じ振るまいですか?

Aベストアンサー

配列、ポインタなどよりももっと基礎的な概念である「右辺値」、「左辺値」を理解しましょう。

int i ;
この形で宣言されたiは代入式の右辺(代入する値)にも左辺(代入される領域)にも使うことが出来ます。
int a ;
a = i ;
i = 10 ;

C言語でも他のほとんどの言語でも「変数は右辺の時と左辺の時とでは解釈が違う」という原則があります。

代入式の右辺に配置出来るのは『値』です。
変数であっても良いし定数であっても、式であってもかまいません。
左辺がポインタ変数の場合は右辺はアドレス値(またはアドレス式)です。
代入式の右に配置可能な値を右辺値といいます。

代入式の左に配置出来るのは『領域』です。
変数であっても良いし、配列要素でもかまいません。
また、領域を示す式(int i[1]のときの*iなど)でもかまいません。
配列名(int i[1]のときのi)や定数は領域を持たないため、左辺に配置することが出来ません。
代入式の左に配置可能な領域を左辺値といいます。

int i[1] ;
この形で宣言されたiは右辺値に利用できます。
int *a ;
a = i ;
しかし、iだけでは領域を持たないため左辺値になりえません。
i = 1 ; //コンパイルエラーが出る。

コンパイル時に「有効な左辺値でない」と言う意味のエラーが出るのは「領域を示さない値を左辺値として使っている時」です。

どちらかと言うと「基礎理論」の部類なのでプログラム言語の本などには書いてないのですが、実は最も大切なのが「基礎理論」です。
頑張って勉強してください。

配列、ポインタなどよりももっと基礎的な概念である「右辺値」、「左辺値」を理解しましょう。

int i ;
この形で宣言されたiは代入式の右辺(代入する値)にも左辺(代入される領域)にも使うことが出来ます。
int a ;
a = i ;
i = 10 ;

C言語でも他のほとんどの言語でも「変数は右辺の時と左辺の時とでは解釈が違う」という原則があります。

代入式の右辺に配置出来るのは『値』です。
変数であっても良いし定数であっても、式であってもかまいません。
左辺がポインタ変数の場合は右辺はアドレス...続きを読む

Qプログラミング入門者、言語の選択?

プログラミングは本当に初めてですが、言語の選択について質問させて下さい。
ある事がキッカケでプログラミングなる物を初めてみようと思ったのですが、
javaであったり、C+であったり・・・と色々な言語がある様で戸惑っています。
それぞれの言語を勉強するに当たり、必要な環境等は書店で売られている入門書で十分理解出来る(内容では無く用意するソフト等の事)のですが、入門の入門にでも該当するのでしょうか?どの言語が何に向いている(又は初心者向けor上級者向け等)と言った基礎の基礎って意外と無いものです。
家計簿ソフトの様な物(用途は違う)が出来たら最高なのですが、何(言語)から勉強したら良いのでしょう?
難易度の高低より、出来れば投資額が少なく、汎用性を重視したいのですが・・・
Windows CE等のPDAなんかでも稼働するソフトなら更に良いのですが・・・。
ps:難易度の高低より・・・以降の希望が無謀な事なのかどうかも分からない位ですが、
   初めて見ようと思った気持ちを大切に恥ずかしながら質問させて頂きます。よろしくお願いします。

Aベストアンサー

Excelはどうでしょう?

Excel???なんて思われるかもしれませんが、マクロ機能の中にVBAというBasicが搭載されています。これはMicrosoftの開発言語のVBとほぼ同じことができるものです。
Excelの上で動かせるのでExcelの機能も簡単にアクセスできますし、家計簿のようなものを作るのであれば簡単にできると思います(完成度の高いものを望むのであれば難しいですが)。

投資額についてはExcelならたいていのメーカー製パソコンには最初からインストールされているのでゼロに近いですよね。

WindowsCEで動かしたいのであれば...Microsoftはホームページ上でeMbeded Visual Toolsというのを無料でダウンロードできるようにしています。これを使えばVisual C++もしくはVisual Basicで開発をすることができます。この2つの選択肢からでしたらVisual Basicをお勧めしますが...PDAはその必要性があまりないのでしたら初めは考えない方が無難だと思います。

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。


人気Q&Aランキング