電子書籍の厳選無料作品が豊富!

 ちょっと数学的な問題を、パソコンで解きたいと思います。

 合計が決まった数で、ある数の集まりの中からその和の組み合わせを求めたいのですが、何を使ってどのようにすればよいでしょうか。
 ソフトは、Excel/Access/FileMakerがあります。
 回答でなくても、自分ならこうやるよ、という意見も大歓迎です。
 よろしくお願いします。

(例題)
{2550,1210,90150,110223,17112,142816,87442,14650,1701413,11788,4460,24180}の中で総和が1949096になる数の組み合わせは?

A 回答 (1件)

すべての組み合わせについて合計を計算し、与えられた数と一致するか比較するプログラムを書いちゃいます。



InternetExplorerがあれば、JavaScriptが使えるはずなので、
それで書いてみます。下記の内容のファイルをたとえば、kumi.html
という名前で保存し、IEで開けば結果が表示されます。

<pre>
<script>
input="2550,1210,90150,110223,17112,142816,87442,14650,1701413,11788,4460,24180"
sum=1949096
data=new Array(20)
data=input.split(",")
n=data.length

//一応、入力値の解釈が正しいかどうか表示してみる。
for(i=0;i<n;i++){ document.writeln(i+" "+ data[i]) }

// curent_sum = Σ flag[i]*data[i] 
// データ数分の和を計算する。flag[i]は、0か1の値をとる。
// 配列useをいろいろなパターンで生成することですべての組み合わせを調べる。

flag=new Array(n)
n_ans=0 //見つかった答えの数

ni_no_n_jou = Math.pow(2,n) //2^nとする言語が多いが、JavaScriptではMath.powを使う。

for(j=0;j<ni_no_n_jou;j++){
make_flag_array(j) //サブルーチン、下で定義されている。
cur_sum=0
for(i=0;i<n;i++){cur_sum += flag[i]*data[i] }
if(cur_sum==sum){ n_ans++; write_ans() }
}

function make_flag_array(j){
tmpj=j
for(i=0;i<n;i++) {
amari = tmpj % 2
flag[i]=amari
tmpj = (tmpj - amari)/2
}
}

function write_ans(){
document.writeln("答え("+n_ans+"): ")
for(i=0;i<n;i++){ document.write(" + "+flag[i]*data[i]) }
document.writeln()
}

</script>
</pre>

参考URL:http://tohoho.wakusei.ne.jp/js/math.htm#xMath,ht …
    • good
    • 0
この回答へのお礼

 私はてっきりVBAを使った回答が来ると思っていましたが、JavaScriptとは度肝を抜かれました。

 すばらしいです!有難うございました!

お礼日時:2003/03/05 21:56

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