找到与 C++ 中的公式匹配的最小整数
Find the lowest integer that matches equation in C++
可能的重复项:
寻找哈代拉马努金数
我需要找到最低的自然数x
x = k^3 + l^3 = i^3 + j^3
(k, l, i, j)
必须都不同。
我尝试了以下四个 for 循环,但由于变量无限增加,我无法得到正确的解决方案......
for (int i=0;;i++)
for (int j=i+1;;j++)
for (int k=j+1;;k++)
for (int l=k+1;;i++)
compare(i,j,k,l);
你需要重新构建你对问题的看法。
它实际上是在说:以两种不同方式表示为两个立方体之和的最小自然数是多少?
问题语句调用该数字 x,立方体对是 (i, j) 和 (k, l)。
以这种方式重述,它并没有那么糟糕。下面是伪代码中的提示:
function count_num_cubic_pairs(n):
cubic_pairs = []
for i..n:
first_cube = i * i * i
remainder = n - first_cube
if remainder is a cube and (first_cube, remainder) not in cubic_pairs:
cubic_pairs.add((first_cube, remainder))
return length(cubic_pairs)
困难的部分将是测试remainder is a cube
浮点误差是否会使这复杂化很多。这就是这个问题的真正内容 - 玩得开心。
使代码正常工作的一种简单方法是限制变量的域,然后一次扩展一点。
正如 mazayus 所提到的,你保持每个变量严格大于前一个变量,所以你永远不会有任何可能正确的变化。
这样的东西可能会起作用(伪代码),但它效率非常低:
for max in [100, 200, 300, ...]
for i in [0..max]
for j in [0..max]
for k in [0..max]
for l in [0..max]
if (i equals k or l, or j equals k or l) continue
if (i^3 + j^3 equals k^3 + l^3)
return answer
int i = 1
int j = 3
int k = 2
int l = 4
do {
do {
do {
do {
compare(i, j ,k l);
i++;
} while (i < k);
k++;
} while (k < j);
j++;
} while(j < l);
l++;
} while(l < 100);
像这样的东西尝试了没有 dups 的所有数字组合(最大值为 100),i
你的循环假设i<j<k<l
,这不一定是真的。(可能是那个j>k
。一旦你得到了正确的假设,你就可以对循环重新排序,这样第一项是最大的,所以其他循环是有限的。
下面是一个i>j
、i>k>l
、
for (int i=1;;i++)
for (int j=1;j<i;j++)
for (int k=1;k<i;k++)
for (int l=1;l<k;i++)
compare(i,j,k,l);
一旦你开始工作,尝试通过检查i*i*i+j*j*j-k*k*k
的立方根是否是自然数来消除第四个循环。然后尝试为k
找到更明智的起始值。
相关文章:
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何只允许用户输入正整数
- 如何在c++中从文本文件中逐行读取整数
- C++:如何循环通过向量中的整数元素
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 序列化,没有库的整数,得到奇怪的结果
- 在一定长度后从数组中打印时缺少整数
- std::当在256字节边界上写入整数时,流的奇怪行为
- 内联程序集printf将整数解释为地址
- 是否基于数组B整数打印数组A中的整数
- 如何在C++中将整数转换为其数字数组