5

これは、より基本的な数学/プログラミングの質問です。除算a/b=cを生成する必要があります。ユーザーにaとbを与え、彼はcに答える必要がありますが、cは小数点以下1桁しか持てません。たとえば、c = 5.2は問題ありませんが、ユーザーは子供であるため、5.23は質問するには多すぎます。したがって、aがx未満、bがy未満、cが小数点以下1桁のみである可能性のあるすべての組み合わせから、この種の除算をランダムに生成できるアルゴリズムが必要です。また、aとbは整数である必要があります。

私は、数字を試し、正しい組み合わせが生成されるまでそれらをチェックするよりも、より洗練された解決策を探しています。また、これはWebコンテンツ用なので、javascriptで実行したいのですが、必要に応じてphpで実行できます。¿誰かが私がそれをどのように行うことができるか知っていますか?私は数学が苦手です。

事前にどうもありがとうございました。

4

5 に答える 5

2

基本的に、A * 10のすべての素数を含むリストを作成し、次に因子のランダムな組み合わせを選択してBを作成します。

        int[] primes = new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997 };
        List<int> factors = new List<int>();
        int x = 1000;
        int y = 650;
        Random rand = new Random();
        int a = rand.Next(x);
        int _a = a * 10;
        int currentPrime = 0;

        //find all factors of a * 10
        while (_a > 1)
        {
            while (_a % primes[currentPrime] == 0)
            {
                factors.Add(primes[currentPrime]);
                _a /= primes[currentPrime];
            }
            currentPrime++;
        }

        int b = 1;
        foreach(int factor in factors)
        {
            if (b * factor > y) break;
            if (rand.Next(2) == 0)
            {
                b *= factor;
            }
        }
于 2012-07-11T19:21:51.673 に答える
2

Cとして生成してみてくださいint/10
次に、生成しBます:

  • ちょうどintの場合(10 * C) % 10 == 0
  • int * 2もしも(10 * C) % 5 == 0
  • int * 5もしも(10 * C) % 2 == 0
  • int * 10そうしないと

次にA = B * C、それはintです

擬似コード:

tenC = rnd();
if(tenC % 10 == 0) B = rnd();
elseif(tenC % 5 == 0) B = rnd() * 2;
elseif(tenC % 2 == 0) B = rnd() * 5;
else B = rnd() * 10;
C = tenC / 10.0;
A = tenC * B / 10;

ここで、rnd()は必要に応じて整数を生成します

于 2012-07-11T19:46:04.487 に答える
1
// Declare variables
var a, b, c, f = 1,
    highestCommonFactor = function(x, y) {
        var i;
        for (i = Math.min(x, y); i > 1; i--) {
            if (x / i == Math.round(x / i) && y / i == Math.round(y / i)) {
                return i;
            }
        }
        return false;
    };

// Pick two random numbers, b and c
// b should be a fairly small integer, i'll choose 5 as an upper limit
// c should be larger than 10 and not end with a 0
b = Math.floor((Math.random() * 5) + 1);
do {
    c = Math.floor(Math.random() * 100);
} while (c.toString().slice(-1) == "0");

// Multiply b by 10
b *= 10;

// Get a value for a
a = (c * b) / 10;

// Divide c by 10
c /= 10;

// Optional - Cancel a and b down to lowest possible integers
/*
while (f !== false) {
    a /= f;
    b /= f;
    f = highestCommonFactor(a, b);
}
//*/

あなたを目覚めさせ続けるための良い数学の挑戦のようなものはありません。aこのコードは生成される傾向がbあり、オプションのコメントを外しても、そのうちの1つが10の倍数になります-可能な限り低い整数セクションまでキャンセルします(bそうでない場合は常に10の倍数になります)。ただし、これはあなたがしていることの性質であると思います。c小数点の後にゼロ以外の数字を正確に1つ持つためには、として表現できる必要があるからint / 10です。

フィドル

于 2012-07-11T20:06:38.677 に答える
0
function findEquation($maxA, $maxB){
    $x = 2;
    $e = NULL;

    do {
        $a = rand(1, $maxA);
        $b = rand(1, $maxB);
        $e = "$a / $b";
        $y = explode(".", $a/$b);
        if(count($y) > 1){
            $x = strlen($y[1]);
        }else {
            $x = 0;
        }
    } while($x > 1);

    return $e;
}

echo findEquation(100,100);

より良いことに、これにより、10進値の長さが2未満の最初の方程式が見つかります。

JavaScriptソリューション:

function findEquation(maxA, maxB){
    var x = 2;
    var e = '';
    var a,b,c,d;

    do {
        a = Math.floor(Math.random() * maxA+1);
        b = Math.floor(Math.random() * maxB+1);
        e = a + '/' + b;
        c = (a/b).toString().split(".");
        if(c.length > 1){
            x = c[1].length;
        }else {
            x = 0;
        }
    } while( x > 1 );

    return e;
}

alert(findEquation(100,100));
于 2012-07-11T18:41:12.627 に答える
0

http://jsfiddle.net/eX7fM/2/

var upper = getRandomInt(2, 100);

var lower;
var answer = 0.99; // sentinel

while (!numberHasOneOrNoDecimals(answer)) {
    lower = getRandomInt(1, upper);
    answer = upper / lower;
}

これにはまだループが含まれますが、純粋なブルートフォースよりも少しエレガントで、ループしないアプローチよりも理解がはるかに簡単です(素因数分解とそのすべてのジャズは私の数学のスキルを超えています)。

于 2012-07-11T18:48:35.720 に答える