質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

5回答

3545閲覧

アルゴリズムの問題。数学ax+by=cを求めるプログラムを作っています。言語を問いません。

otftrough

総合スコア476

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/05/26 04:53

仕事で金額の計算をしていて、
ポール : 24箇所 * 11789円 = 282936円
+
ポール用ボンド : a缶 * 2666円 = b円
+
取付費 : 24箇所 * c円 = d円

ポール + ボンド + 取付費 = 528000円(24箇所の合計金額)

となっていて、ボンドの数量a缶と取付費の単価c円を求めようとしています。
b + d = 528000 - 282936 = 245064
2666a + 24c = 245064
となりますので、つまり「ax + by = c」ということになります。

ネットで調べてみると「べズー等式」というやつらしくて、こちらを参考にしています。
解き方の例
上の画像の式の数字を置き換えると、
2666a % 24 = 245064 (2666aを24で割った余りが245064)
となり、プログラムでは、while文を使ってaを求めようとしています。

java

1int a = 1; 2while((2666 * a) % 24 != 245064) 3 a ++; 4 5System.out.println("a = " + a);

しかし、これではなぜか無限ループになってしまいます。
どこが違うんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wake_up_kemeko

2016/05/26 05:47

2666a + 24c = 245064 を満たすaとcの組み合わせの一覧を出力したいのでしょうか?
guest

回答5

0

べズー等式というのは全くわかりませんが…。
(2666 * a) % 24は24で割った余りなので、0~23しかありえません。
なので245064と一致することなく無限ループしているのだと思います。

投稿2016/05/26 05:01

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otftrough

2016/05/26 05:08

そうか、たしかにその通りだ。
guest

0

aとcがどちらとも1以上の整数値を取るという条件であれば、

int aMax = Math.floor(245064 / 2666); int tmp; int c; for(int a = 1; a <= aMax; a++){ tmp = (245064 - a * 2666); if(tmp % 24 == 0){ c = tmp / 24; System.out.println("a = " + i + ", c = " + c); } }

ozwkさんの処理とほぼ一緒ですね。

投稿2016/05/26 05:41

abs123

総合スコア1280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ネットで調べてみると「べズー等式」というやつらしくて

ざっと調べた限り違います。
べズーの等式は
非0の2つの整数aとb、その最大公約数cに対して、
ax+by=cを満たすx,yの組が存在する。
ということです。

要するに今解こうとしている問題とべズーの等式は関係ないです。
問題を関係ない方法で解こうとしているので変なことになっています。


ax+by=cを求めたいとのことですが、
変数2つに対して式が1つと足りないので解けません。

x,yが自然数という条件つけても、解があるかは問題次第です。


間違っていたらすみません。:

C

1//2666x + 24y = 245064 2int a = 2666; 3int b = 24; 4int c = 245064; 5 6int x = 1; 7while (a*x < c){ 8 if( (c - a*x)%b == 0){ 9 int y = (c - a*x)/b; 10 printf("%d,%d\n",x,y); 11 } 12 x++; 13}
12,8878 24,7545 36,6212 48,4879 60,3546 72,2213 84,880

投稿2016/05/26 05:10

編集2016/05/26 05:38
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otftrough

2016/05/26 05:14

???工業高校卒なので、何言ってるのかさっぱりです...
ozwk

2016/05/26 05:31 編集

追記しました
otftrough

2016/05/26 06:31

ありがとうございます、やっぱり計算だけが目的のプログラムなら、 手計算を忠実にプログラムに組み込むよりも、CPU任せにwhile文でただ答えをひとつひとつ調べて探すほうが楽ですね。
guest

0

皆さん既出ですがC++で書いてみました。

C++

1#include<iostream> 2int main() { 3 int a, c; 4 const int glue_val = 2666, attach_pos = 24, sum_val = 245064; 5 6 int max_a = sum_val / glue_val; 7 for (int i = 0; i < max_a; i++) { 8 if ((sum_val - glue_val * i )% 24 == 0) { 9 std::cout << "num_glue:" << i << "\t" 10 << "attach_val:" << (sum_val - glue_val * i) / attach_pos 11 << std::endl; 12 } 13 } 14 15 16}

result

1num_glue:0 attach_val:10211 2num_glue:12 attach_val:8878 3num_glue:24 attach_val:7545 4num_glue:36 attach_val:6212 5num_glue:48 attach_val:4879 6num_glue:60 attach_val:3546 7num_glue:72 attach_val:2213 8num_glue:84 attach_val:880

投稿2016/05/26 06:00

wake_up_kemeko

総合スコア104

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

すみません、計算方法が違ったみたいです。

投稿2016/05/26 05:44

otftrough

総合スコア476

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問