package testing.project;
public class PalindromeThreeDigits {
public static void main(String[] args) {
int value = 0;
for(int i = 100;i <=999;i++)
{
for(int j = i;j <=999;j++)
{
int value1 = i * j;
StringBuilder sb1 = new StringBuilder(""+value1);
String sb2 = ""+value1;
sb1.reverse();
if(sb2.equals(sb1.toString()) && value<value1) {
value = value1;
}
}
}
System.out.println(value);
}
}
这是我用Java写的代码…除此之外,还有什么有效的方法吗?我们还能进一步优化此代码吗?
我们假设最大的回文数将是6位而不是5位,因为143 * 777 = 111111是回文。
如其他地方所述,6位数的10进制回文数abccba是11的倍数。这是正确的,因为a * 100001 + b * 010010 + c * 001100等于11 * a * 9091 + 11 * b * 910 + 11 * c * 100。因此,在我们的内部循环中,如果m不是11的倍数,我们可以将n减少11。
我们正在尝试寻找由两个3位数数字相乘的最大回文数。为了找到较大的结果,我们首先尝试使用大除数:
我们跟踪迄今为止在变量q中发现的最大回文。假设q = r·s,r <= s。我们通常有m <r <= s。我们要求m·n> q或n> = q /
m。当发现较大的回文体时,n的范围受到更多限制,原因有二:q较大,m较小。
附加程序的内部循环仅执行506次,而使用的朴素程序大约为81万次。
#include <stdlib.h>
#include <stdio.h>
int main(void) {
enum { A=100000, B=10000, C=1000, c=100, b=10, a=1, T=10 };
int m, n, p, q=111111, r=143, s=777;
int nDel, nLo, nHi, inner=0, n11=(999/11)*11;
for (m=999; m>99; --m) {
nHi = n11; nDel = 11;
if (m%11==0) {
nHi = 999; nDel = 1;
}
nLo = q/m-1;
if (nLo < m) nLo = m-1;
for (n=nHi; n>nLo; n -= nDel) {
++inner;
// Check if p = product is a palindrome
p = m * n;
if (p%T==p/A && (p/B)%T==(p/b)%T && (p/C)%T==(p/c)%T) {
q=p; r=m; s=n;
printf ("%d at %d * %d\n", q, r, s);
break; // We're done with this value of m
}
}
}
printf ("Final result: %d at %d * %d inner=%d\n", q, r, s, inner);
return 0;
}
注意,该程序是用C语言编写的,但是相同的技术也可以在Java中工作。
问题内容: 我想知道如何解决这个问题(这不是学校的东西,我是业余爱好,我正在做欧拉的练习)。我的代码中的问题是:char c = great.charAt(i); 我想知道如何在great.charAt(i)中看到下一个i。我发布了代码,在此先感谢您的帮助。 问题答案: 查看程序的输出,我看到它具有如下所示的块: 这说明,对于五个数字的子序列,您实际上只是将其中一个数字乘以五倍。 您需要确保迭代该
本文向大家介绍在C ++中查找数组编号的乘积的最后k位,包括了在C ++中查找数组编号的乘积的最后k位的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个由n个元素组成的数组,称为A。我们还有另一个数字k。我们的任务是查找数组A中元素乘积的最后k位。假设A = [15、22、13、19、17],则乘积为1385670,最后k = 3位为670。 为了解决这个问题,我们将模10 k下的数字相乘。
给定N个数字,范围为-100.100。 要求重新排列元素以使产品价值之和最大。此任务中的乘积和定义为a1*a2+a2*a3..an-1*an 例如,给定数字10 20 50 40 30。 1,-2,3,-4,5,-6,7,-8,9,10,11,12,13,14,15,-16 预期的最大乘积为1342。 我的算法给出了下一个重排:
所以我试着使用一个嵌套循环,将长度加到一个int数组中,然后遍历int数组,找到最大的数,但它没有通过测试用例,我开始想,也许我把这个问题复杂化了,有一个更简单的方法。这是我试过的。
假设第一个输入行是这样的: 第二输入线为: 输出应为: 我试着把所有的数字放在一个单独的数组里。但我不知道如何找到所说的数组的乘积。输出大小应该是第一个数的大小+第二个数的大小。因此,如果产品大小较小,它应该有一个前导0。
本文向大家介绍在C ++中查找前N个质数的乘积,包括了在C ++中查找前N个质数的乘积的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个数字n。我们必须找到1到n之间的质数的乘积。因此,如果n = 7,则输出将为210,因为2 * 3 * 5 * 7 = 210。 我们将使用Eratosthenes筛分法来查找所有素数。然后计算它们的乘积。 示例 输出结果