Наибольшее число палиндром, которое является произведением двух простых пятизначных чисел
1,00
р.
р.
Делал приложение по ТЗ из одной компании. Сделал андроид-аппку, получил результат на эмуляторе, вроде же верный. Но HR просто отписалась, что ответ который выдало мое приложение неверен. Айчары люди довольно занятые, потому редко кто может указать на ошибку, а навязываться после отказа - дело очень неблагодарное. Но все же хочется хоть для себя выполнить задание до конца. Из требований было: Напишите программу, которая возвращает наибольшее число палиндром, которое является произведением двух простых пятизначных чисел, а также возвращает сами сомножители. Простое число - это натуральное число, которое делится нацело только на 1 и на себя само (2, 3, 5, 7, 11, …) Палиндром – строка, которая читается одинаково в обоих направлениях (например ABBA) Сам принцип поиска простых чисел мне понятен. Использовать массивы было нецелесообразно потому решето Эратосфена и аналоги пришлось отбросить - уж очень много памяти сожрало бы создание массива на такое количество значений. Потому решил использовать циклы для сопоставления и отсеивания. Вот код моего андроид-приложения: MainActivity: 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 }<br> 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++) {<br> z = i % j if (z == 0 && j <= divNumMax) { break <br> } 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 } } } Скриншот полученного результата на эмуляторе:
Ломаю голову где ошибся, что упустил. Не прошу делать за меня ТЗ, но не хочу оставлять позади какую-то неразобранную проблемму.
Ответ Ваше целое несколько раз завернулось вокруг максимального значения int - 2,147,483,647. Проверьте: 99923 * 87541 = 8 747 359 343 А также: На какую цифру должно заканчиваться произведение Ваших двух простых чисел?