我根据一家公司的TK提出了申请。我做了一个android应用程序,在模拟器上得到了结果,似乎是正确的。但是 HR 只是取消订阅我的申请给出的答案不正确。
Aychars 是很忙的人,所以很少有人能指出错误,拒绝后被强加于人是一项非常吃力不讨好的任务。但是,我还是想至少为自己完成任务到最后。
要求是:
编写一个程序,返回最大的回文数,它是两个五位素数的乘积,并返回因子本身。
素数是只能被 1 和自身整除的自然数 (2, 3, 5, 7, 11, ...)
回文是在两个方向上读取相同的字符串(例如 ABBA)
我很清楚找到素数的原理。使用数组是不切实际的,因为必须丢弃 Eratosthenes 的筛子及其类似物——为如此多的值创建一个数组会占用大量内存。
这就是为什么我决定使用循环进行匹配和过滤。
这是我的android应用程序代码:
主要活动:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private int maxNum = 99999;
private int minNum = 10000;
private int divNumMax = 0;
private int palind;
private TextView tv1;
private TextView tv2;
private TextView tv3;
private TextView tv4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (TextView) findViewById(R.id.textView1);
tv2 = (TextView) findViewById(R.id.textView2);
tv3 = (TextView) findViewById(R.id.textView3);
tv4 = (TextView) findViewById(R.id.textView4);
Button btnStart = (Button) findViewById(R.id.button);
btnStart.setOnClickListener(this);
}
@Override
public void onClick(View v) {
divNumMax = (int) Math.sqrt(maxNum);
int fPM;
int sPM;
boolean isNotPalind;
fPM = findMaxPrimeNumber(maxNum);
sPM = findMaxPrimeNumber(fPM - 2);
isNotPalind = findPalindrome(fPM, sPM);
while (isNotPalind) {
if (sPM <= fPM && sPM > minNum) {
sPM = findMaxPrimeNumber(sPM - 2);
isNotPalind = findPalindrome(fPM, sPM);
} else if (sPM <= minNum) {
fPM = findMaxPrimeNumber(fPM - 2);
sPM = fPM;
}
tv2.setText("1-st primary number: " + fPM);
tv3.setText("2-nd primary number: " + sPM);
tv4.setText("1-st * 2-nd = " + palind);
}
}
private int findMaxPrimeNumber(int maxNumPre) {
int i;
int j;
int z;
int maxNumNew;
for (i = maxNumPre; i >= minNum; i = i - 2) {
for (j = 3; j <= divNumMax; j++) {
z = i % j;
if (z == 0 && j <= divNumMax) {
break;
} else if (z != 0 && j == divNumMax) {
maxNumNew = i;
return maxNumNew;
}
}
}
return 10000;
}
private boolean findPalindrome(int firstPrime, int secondPrime) {
int resultOfMath = firstPrime * secondPrime;
String ltrResult = Integer.toString(resultOfMath);
String rtlResult = new StringBuffer(ltrResult).reverse().toString();
if (ltrResult.equals(rtlResult)) {
palind = resultOfMath;
return false;
} else {
return true;
}
}
}
模拟器上的结果截图:
我在我犯了错误的地方挠头,我错过了什么。我不要求你为我做TK,但我不想留下一些未解决的问题。

您的整数多次环绕最大值
int-2,147,483,647。查看:
也:
你的两个质数的乘积应该以什么数字结尾?
筛子工作正常,以前在平板电脑上查找 0-10,000,000 范围内的所有素数大约需要 15 秒。最主要的是正确编写算法。
也许我误解了你的算法(请纠正我)
为什么第二个循环是通过增加参数来进行的,而不是从大到小?
有一个细微差别:我们将考虑相同的任务,但在 0-15 的范围内,同时我们丢弃回文条件(这里它不起作用)。
a = 13; b = 2; a*b = 26但是还有其他素数的乘积会产生更大的结果吗?11*13 > 26
这是这个问题的正确答案,也是在社会工作中遇到的:
回文 - 999949999
乘数 1 - 33211
乘数 2 - 30109
算法实现如下:
寻找最大回文的方法(输入是素数列表)
搜索素数的方法(在输入处,正在检查的数字范围内的最大值和最小值):
检查找到的数字是否是回文(输入时检查的数字):
而且我也忘了写应该调用这些方法:)
我是这样做的:
以及方法的进一步实施......
稍微了解一下算法。在我看来,这里已经不能正常工作了:
事实证明,您将打印遇到的第一个回文,但不能保证它会是最大值。
让我们举一个抽象的例子,运行所有数字的 10 到 1 个可能的乘积。
根据您的算法,我们绕过第一个圆圈:
10*10, 10*9 , 10*8, 10*7....<- 并立即显示遇到的第一个回文然后是第二轮:
9*9, 9*8, 9*7...<- 或者在这里我们立即显示遇到的第一个回文然后是第三个:
等等...
假设在第一轮 10 * 2 是回文(假设!)
也让我们在第二轮说 9 * 8 - 这也是一个回文(假设!)
但是你的程序会输出 10*2(即使 9*8 大于 10*2)
也就是说,遇到的第一个不是一个选项。如果我错了,希望作者理解我并纠正我。
问题的条件暗示了两个简单的五位数的乘积。该算法适用于两位、三位、四位数字。但直接拒绝为 5 工作。这里有什么错误?