每个数字应大于0。 订单并不重要。例如:值可以是25,50,25或25,25,50或50,25,25。 也许我们可以使用Random类并生成3个int值,每个值小于99且大于0,然后添加3个数字。如果加法等于100则打印3个数字。 有更好的方法,还是我应该使用上述方法?
编辑:我试图解决此问题:https://curiosity.com/topics/can-you-solve-the-cat-fish-bird-riddle-curiosity/
我计划得到3个加起来为100的数字,然后我会在另一种方法中使用这3个数字将第一个数字乘以10,第二个数字加3,最后一个数字加0.5。如果结果加起来那么我就找到了解决方案。对?
编辑2.1: 这是我提出的代码。它有效!
// cat, fish, bird riddle
class RiddleOne {
private float num, a, b, c, x, y, z;
public void getBird() {
for (x = 1; x <= 100; x++) {
for (y = 1; y <= 100-x; y++) {
z = 100 - x - y;
if (checkQuantity()) {
System.out.print("\n\tThe quantity of cat, fish and bird toys purchased are " +x +", " +y +" and " +z +" respectively.");
System.out.print("\n\tThe total price of each toy is " +a +", " +b +" and " +c +" respectively.");
num = a + b + c;
System.out.print("\n\tThe total price is: " +num);
break;
}
}
}
}
public boolean checkQuantity() {
a = 10 * x;
b = 3 * y;
c = z / 2;
if (((a + b + c) == 100) && c != 0)
return true;
return false;
}
public static void main(String[] args) {
RiddleOne t = new RiddleOne();
t.getBird();
}
}
答案 0 :(得分:3)
当顺序无关紧要时,要做的就是让你的算法以这样的方式运行:对于每个解决方案,它只能生成一定的顺序。这样你知道你没有重复。例如,我将查看排序顺序。 (这意味着&lt; = b&lt; = c)
您将从生成a开始,因为其他2必须高于或等于a,a必须低于100/3,否则b或c必须低于100/3。
然后我们知道b必须至少是a,它必须低于或等于100 - a - b,因此也低于或等于(100 - a)/ 2.
我们的算法将是这样的:
public void printAllCombinations() {
for (int a = 1; a <= 100/3; a++) {
for (int b = a; b <= (100 - a)/2; b++) {
int c = 100 - a - b;
// Report a, b and c
}
}
}
答案 1 :(得分:1)
每个数字介于1和100之间(好吧,98),因此您可以通过嵌套循环获得100 * 100 * 100 =百万个组合,跨越每个数字的所有可能值。或者您可以查看两个数字的所有组合,并要求第三个为100-a-b。由于顺序无关紧要,因此您需要一种过滤掉重复项的方法。
使用随机数不是一个好的解决方案,因为您无法保证所有可能的组合,即使您只是继续使用它足以获得所有有效组合的合理机会,你需要更多的尝试,而不仅仅是尝试每一次组合。
答案 2 :(得分:0)
你只需要循环两个数字;我们称他们为i
和j
。由于这些数字需要总计为100,因此第三个数字k
将立即知道:k = 100 - i - j
。
下面我写了一些代码来做到这一点:
public class Sum100 {
public static void main(String argv[]) {
for (int i = 0; i <= 100; i++) {
for (int j = i; j <= 100-i; j++) {
int k = 100 - i - j;
System.out.printf("i=%3d, j=%3d, k=%3d\n", i, j, k);
}
}
}
}
以下是所有输出中的几行:
i= 38, j= 59, k= 3
i= 38, j= 60, k= 2
i= 38, j= 61, k= 1
i= 38, j= 62, k= 0
i= 39, j= 39, k= 22
i= 39, j= 40, k= 21
i= 39, j= 41, k= 20
如您所见,代码可以为任何变量生成值0。尝试解决这个问题,以便更好地了解算法正在做什么。
跟进问题:
您能否仅仅通过查看代码循环来准确预测将打印多少行?
此算法的Big-O运行时间是多少?
答案 3 :(得分:0)
绝对不要使用随机性。
第一步是在循环中选择1到33之间的数字j
。接下来,选择k
与j
之间的(99-j)/2
和100-j-k
。最后,确定第三个数字:<form role="search" method="get" id="searchform" class="searchform" action="">
<span class="fa fa-map-marker my-fa"></span>
<input type="text" value="" name="s" id="search-input" class="s" placeholder="Enter your Postcode" autocomplete="off">
<img id="slider-loading" class="loading" src="https://www.imageupload.co.uk/images/2017/02/05/gps2.gif" />
<input type="hidden" value="profile" name="post_type" id="post_type" />
<input type="hidden" value="country" name="taxonomy" />
<input type="submit" id="searchsubmit" value="GO" class="submit btn" />
</form>
。这将按升序为您提供所有可能的三元组,其值按升序排列,并且比Peteris算法的时间更快。