5

这更像是一个基本的数学/编程问题。我需要生成一个除法a/b=c。我会给用户 a 和 b,他必须回答 c,但 c 只能有一位小数。例如,c=5.2 可以,但 5.23 要求太高,因为用户是孩子。所以我需要一种算法,它可以从所有可能的组合中随机生成这种除法,其中 a 必须小于 x,b 必须小于 y,c 只能有一位小数。此外,a 和 b 必须是整数。

我正在寻找一种比尝试数字并检查它们直到产生正确的组合更优雅的解决方案。另外,这是针对网络内容的,所以我更喜欢用 javascript 来做,但如果需要,也可以用 php 来做。¿ 有人知道我该怎么做吗?我数学没那么好。

非常感谢您提前。

4

5 回答 5

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 回答
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 回答
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一个是 10 的倍数,即使您取消注释Optional - Cancel down to minimum possible integers部分(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);

更好的是,这将找到第一个十进制值长度 < 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 回答