【发布时间】:2019-11-16 14:11:03
【问题描述】:
我试图解决这个问题超过一天,但我无法找到合理的解决方案。我认为这是一个相当简单的编程问题,更像是一个算法问题。我们有一个给定的数字 N, (1
附:一些例子 - 100 = 4×5×5, 121 = 11×11×1, 8 = 2×2×2, 400 = 8×5×10, 1000 = 10×10×10,4000=16×10×25等等。
int main() {
int m = 0, n = 0, p = 0, q = 0, i = 0;;
std::cin >> n;
i = int(std::cbrt(n));
while (true) {
int ten = std::cbrt(n);
if (pow(ten, 3) == n) {
m = ten;
p = ten;
q = ten;
break;
}
int square = n;
if (i * i == square) {
n = i;
m = i;
p = i;
break;
}
if (i == 1) {
m = n;
p = 1;
q = 1;
break;
}
if (n % i == 0) {
n = n / i;
m = i;
p = n;
break;
}
i++;
}
i = std::cbrt(n);
while (true) {
int ten = std::cbrt(n);
if (pow(ten, 3) == n) {
m = ten;
p = ten;
q = ten;
break;
}
int square = n;
if (i * i == square) {
p = i;
q = i;
break;
}
if (i == 1) {
q = 1;
break;
}
if (n % i == 0) {
q = n / i;
p = i;
break;
}
i++;
}
std::cout << m << " " << p << " " << q << std::endl;
return 0;
}
【问题讨论】:
-
请扩展“不起作用”。如果没有输入、预期输出和实际输出的具体示例,我选择假设“不工作”意味着您的计算机关闭,因为这符合字面意思。一旦你选择了一个有问题的案例,看看你是否可以减少我们被要求检查的代码量。 minimal reproducible example 是调试中有用的第一步。
-
好吧,“不工作”意味着它输出错误的答案。
-
为什么我两次看到几乎相同的代码?
-
我认为随着数量的增加,反复试验会变得乏味。如何分解它并构造绝对值接近的因子?作为奖励,尝试击败 1 + -1 + -N。
-
@Stuffy 更好,但还不够。错误的答案到底是什么?正如我所说,您应该给出输入、预期输出和实际输出的具体示例。 (你说
6是N的一个值,但它不起作用。那是你的输入。所以你所缺少的只是一句话,比如:“当N是6 时,我应该得到3,2,1,但我实际上得到了6,1,1。” 或者不管数字是什么——我承认 6 小到足以让我猜到它们。)