Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/32: Рейтинг темы: голосов - 32, средняя оценка - 4.66
5 / 3 / 4
Регистрация: 30.01.2015
Сообщений: 25

Найти наибольший палиндром, который получится в результате произведения двух чисел

30.01.2015, 22:09. Показов 6661. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите с решением, пжст!

Задача

Найти наибольший палиндром, который получится в результате произведения двух чисел, состоящих из n десятичных цифр.

Ожидаемый результат: класс Palindrome с методом findMax, принимающий количество десятичных цифр в исходных числах.
Пример: для n=2 результат 9009 (91 * 99 = 9009).

Критерии оценки:
- корректное решение задачи
- приемлемая производительность - время выполнения менее 1 минуты для 6-значных чисел

Добавлено через 9 минут
НА Java
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.01.2015, 22:09
Ответы с готовыми решениями:

Найти наибольший палиндром, сделанный из произведения двух 3-значных чисел
Дали такое задание: The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 х 99. Find the largest palindrome...

Найти сумму двух чисел, полученных в результате сравнения чисел, полученных в результате вычисления выражений
Даны действительные числа a, b, c. Найти: max(a+b, b+c) + min(a+c, b)

Найти самый большой палиндром, полученный умножением двух трёхзначных чисел (Python -> C++)
Помогите переписать программу из Python to C++ palindromic = for i in range(999, 99, -1): if i % 10 == 0: continue ...

10
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
02.02.2015, 00:50
Лучший ответ Сообщение было отмечено Serj2015 как решение

Решение

Serj2015, актуально?

Добавлено через 1 час 10 минут
Цитата Сообщение от Serj2015 Посмотреть сообщение
приемлемая производительность - время выполнения менее 1 минуты для 6-значных чисел


Добавлено через 16 минут
Ладно, оставлю. Может пригодиться кому-нибудь. Средняя скорость выполнения для 6-значных чисел - 60 миллисекунд. То есть меньше 1 секунды.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Palindrome {
 
    int findMax(int n) {
        
        int number = (int) Math.pow(10, n) - 1;
        int length = String.valueOf(number).length();
        int max = 0;
        
        for (int j = number; j > 0; j--) {
            long res = number * j;
            int l = String.valueOf(res).length();
            String strnumber = String.valueOf(res);
            int k = 0, count = 0;
            for (; k < l / 2; k++) 
                if (strnumber.charAt(k) == strnumber.charAt(l - k - 1)) count++;
            
            if (count == k) {
                max = Integer.parseInt(strnumber);
                break;
            } 
        }
        return max;
        
    }
    
    public static void main(String[] args) {
        Palindrome p = new Palindrome();
        System.out.println(p.findMax(4));
    }
}
1
5 / 3 / 4
Регистрация: 30.01.2015
Сообщений: 25
02.02.2015, 15:09  [ТС]
А можете расписать где что выполняется? И посоветуйте с чего начать освоение Java
0
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
02.02.2015, 15:25
Держите. Сделал код еще эффективнее.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Palindrome {
 
    long findMax(int n) {
        
        //узнаем самое большое n-циферное число так,
        //что возведем в n-ую степень 10 и отнимем 1.
        long number = (long) Math.pow(10, n) - 1;
 
        for (long j = number; j > 0; j--) { //цикл начинаем от самого большого n-циферного числа
            long res = number * j; //переумножаем самое большое n-цифреное и пришедшее число в цикле
            int l = String.valueOf(res).length(); //берем длину числа, которое получили в результате умножения
            String strnumber = String.valueOf(res); //int переводим в String
            int k = 0, count = 0;
            for (; k < l / 2; k++) //стандартный цикл для палиндромов
                if (strnumber.charAt(k) == strnumber.charAt(l - k - 1)) count++; //сравниваем первые и поселедний знак в числе,
                                                                                 //второе и предпоследний и т.д.
                                                                                 //count - обычный счетчик. Узнаем, сколько пар в числе между собой равны.
            if (count == k) return Long.parseLong(strnumber);  //если count равен количеству элементов, которое сравнивали 
        }
        return 0;
    }
    
    public static void main(String[] args) {
        Palindrome p = new Palindrome();
        System.out.println(p.findMax(5));
    }
}
0
5 / 3 / 4
Регистрация: 30.01.2015
Сообщений: 25
02.02.2015, 16:13  [ТС]
Проверил задачу на 7-значных числах и оказалась что 9997647 * 9998017 = 99956644665999 что противоречит ходу решения вашего кода
0
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
02.02.2015, 16:23
Serj2015, беда! Сейчас буду исправлять.

Добавлено через 5 минут
Serj2015, просто я для 7-значных даже не тестировал.
0
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 9
03.02.2015, 10:41
Prorok2323, Я вот сел исправлять с тобой и понял что я не могу в палиндромы.
0
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 7
03.02.2015, 15:11
Изучаю java недавно. Пока на работе, под рукой нет ide и пишу в блакнотике. Вот 4 задачу эйлера хотел решить алгоритмом ниже. Оцените пожалуйста.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Euler4 {
    public static void main(String[] args) {
        int n;                                  //число палиндром
        int nl;                 //длина числа палиндрома
        int nMod;               //на что делим
        int diff;               //разница
        int degMult;                //степень
        int newN;
        string st;
        max=0;              
        for (int i=100; i<1000; i++) {
            for (int j=100; j<1000; j++) {
                n=i*j;                      //Произведение трёхзначных чисел
                newN=0;                     //Перевёрнутое число
                nMod=10;                    //Делитель кратный 10
                diff=0;                     //разница
                nl=(string st = String.valueof(n)).length;      //определяем длину n             
                degMult=nl-1;                   //Степень умножения
                for (int x=0; x<nl; x++) {          //Цикл для построение перевёрнутого числа
                    newN+=(n%nMod-diff)*(10^(degMult)); 
                    diff=n%nMod;                
                    nMod=nMod*10;
                    degMult-=2;                     
                }
                if (newN=n & n>max) max=n;          //проверка на палиндромность и максимальность
                                            
            }
        }
    }
}
Заранее извиняюсь, все пробелы пропали
0
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 9
04.02.2015, 09:54
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
public class Palindrome {
    class StackLong{
        long[] arr;
        int m = -1;
        public StackLong(int i){
            arr = new long[i];
        }
        public void push(long a){
            arr[++m] = a;
        }
        public long pop(){
            return arr[m--];
        }
        public boolean isEmpty(){
            if (m==-1)
                return true;
            else
                return false;
        }
        public int getSize(){
            return m+1;
        }
    }
 
 
    public boolean checkPalindrome(long a){
        String palindrome = Long.toString(a);
        StringBuilder reverse = new StringBuilder(palindrome).reverse();
        String reversepal = String.valueOf(reverse);
        if(palindrome.equals(reversepal))
            return true;
        else
            return false;
    }
 
 
    public long findMax(int n){
        int dec = 10;
        long number = 1;
        for(int j = n; j > 0; j--){
            number *=dec;
        }
        long consta = 1;
        for(int j = n-1; j > 0; j--){
            consta *=dec;
        }
        number--; //понижение переменной до максимально вожможного n-значного числа
 
        long res = 1;
        //StackLong stack1 = new StackLong((int) (number-1));
        //System.out.println(stack1.pop());
        //StackLong stack2 = new StackLong((int) (number-1));
        long[] arr = new long[(int)number-1];
 
        long maxmul = number*number;
 
        foo:
        for(long outer_number_2 = number;outer_number_2 >=consta;outer_number_2--){
            long outer_number_1 = number;
            long maxmulouter = outer_number_1 * outer_number_2;
            long maxmulinner = 0;
 
            long inner_number_1_mminner = 0;
            long inner_number_2_mminner = 0;
 
            if(checkPalindrome(maxmulouter)){
                res = maxmulouter;
                System.out.println(outer_number_1 + " " + outer_number_2);
                break foo;
            }
 
            if(maxmulouter < maxmul){
                //aaaSystem.out.println(outer_number_1 + "*" + outer_number_2 + " = " + maxmulouter + "<" + maxmul + " = true");
                int counter = 0;
 
                foo2:
                for(long inner_number_1 = number-1;inner_number_1>=outer_number_2;inner_number_1--){
                    if(arr[((int) (inner_number_1 - 1))] == 0){
                        arr[((int) inner_number_1-1)] = inner_number_1;
                    }
                    //System.out.println(arr[((int) inner_number_1-1)]);
 
                    long inner_number_2 = arr[((int) inner_number_1-1)];
 
                    long tempmminner = inner_number_1*inner_number_2;
 
                    if(checkPalindrome(tempmminner)){
                        res = tempmminner;
                        System.out.println(inner_number_1 + " " + inner_number_2);
                        break foo;
                    }
 
                    if(tempmminner < maxmul){
                        if(maxmulinner<tempmminner){
                            maxmulinner = tempmminner;
                            inner_number_1_mminner = inner_number_1;
                            inner_number_2_mminner = inner_number_2;
                        }
                        //System.out.println(inner_number_1 + "*" + inner_number_2 + " = " + maxmulinner + "<" + maxmul + " = true");
                    } else {
                        arr[((int) (inner_number_1 - 1))] = --inner_number_2;
                        inner_number_1++;
                        //System.out.println(inner_number_1 + "*" + inner_number_2 + " = " + maxmulinner + "<" + maxmul + " = false");
                    }
                }
                if(maxmulouter > maxmulinner){
                    maxmul = maxmulouter;
                } else {
                    maxmul = maxmulinner;
                    arr[((int) (inner_number_1_mminner - 1))] = inner_number_2_mminner - 1;
                    outer_number_2++;
                }
            } else {
                //aaaSystem.out.println(outer_number_1 + "*" + outer_number_2 + " = " + maxmulouter + "<" + maxmul + " = false");
            }
            //aaaSystem.out.println(maxmul);
        }
        return res;
    }
    public static void main(String[] args){
        Palindrome a = new Palindrome();
        System.out.println(a.findMax(5));
    }
}
Как-то так...
От кода остались мои эксперименты со стеком, но я понял что лучше через обычный массив делать.
В общем, суть в том, чтобы находить максимально возможное произведение чисел с последующим отсеканием этих чисел. В этих произведениях и будет палиндром. Для 6-значного числа вроде быстро работает. У меня есть более быстрый алгоритм, но я уже сам не понимаю как он работает.
А, ну и массив такой раздутый не нужен, можно на что-то другое переделать.

Добавлено через 6 минут
Prorok2323, ты кстати не учел что, максимальный палиндром может быть и такой как 993*913=906609.
Так что твой алгоритм вообще не выполняет сути задания, даже для 3-значных чисел. Или я что-то путаю?
Serj2015, если тебе такой алгоритм сойдет, я тебе могу объяснить как он работает.
0
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 9
27.06.2015, 00:18
Я немного ускорился и сделал алгоритм побыстрее. Как вам такой?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import java.util.*;
 
/**
 * Created by GoldenMelon on 26.06.2015.
 */
public class Palindrome {
    Comparator<Node> comparator = new NodeComparator();
    PriorityQueue<Node> queue = new PriorityQueue<>(comparator);
    Palindrome(){
 
    }
    public boolean checkPalindrome(long a){
        String palindrome = Long.toString(a);
        StringBuilder reverse = new StringBuilder(palindrome).reverse();
        String reversepal = String.valueOf(reverse);
        if(palindrome.equals(reversepal))
            return true;
        else
            return false;
    }
    public void findMax(int n){
        int dec = 10;
        long number = 1;
        for(int j = 0; j < n; j++){
            number *=dec;
        }
        number--; //понижение переменной до максимально вожможного n-значного числа
        queue.add(new Node(true,number,number,number*number));
        while(!checkPalindrome(queue.peek().productOfMul)){
            Node temp = queue.poll();
            temp.secondMul = temp.secondMul-1;
            temp.productOfMul = temp.firstMul * temp.secondMul;
            if(temp.enterFirst){
                if((temp.firstMul-temp.secondMul == 2)){
                    temp.enterFirst = false;
                    queue.add(new Node(true,temp.firstMul-1,temp.firstMul-1,(temp.firstMul-1)*(temp.firstMul-1)));
                }
            }
            queue.add(temp);
        }
        System.out.println(queue.peek().productOfMul);
        System.out.println(queue.peek().firstMul + " " + queue.peek().secondMul);
    }
    public static void main(String[] args) {
 
        Palindrome pl = new Palindrome();
        pl.findMax(9);
    }
    static class NodeComparator implements Comparator<Node>{
 
        @Override
        public int compare(Node o1, Node o2) {
            if(o1.productOfMul < o2.productOfMul){
                return 1;
            }
            if(o1.productOfMul > o2.productOfMul){
                return -1;
            }
            return 0;
        }
    }
}
class Node{
    boolean enterFirst = true;
    long firstMul;
    long secondMul;
    long productOfMul;
    public Node(boolean e,long f,long s, long p){
        enterFirst = e;
        firstMul = f;
        secondMul = s;
        productOfMul = p;
    }
}
Теперь он считает для 7-значных за 5 секунд на моей машине и около 15 секунд для 8-значных
0
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
27.06.2015, 13:40
Melon,
Будет еще быстрее если не переводить числа в строки и обратно, сравнивайте числа
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.06.2015, 13:40
Помогаю со студенческими работами здесь

Найти наибольший общий делитель двух чисел, трех чисел
Найти наибольший общий делитель двух чисел, трех чисел

Найти наибольшее число палиндром, которое образуется путем умножения двух простых пятизначных чисел
Напишіть програму, яка знаходить найбільше число паліндром, яке утворюється шляхом множення двох простих п'ятизначних чисел. Програма...

Найти наибольший палиндром
Палиндром читается одинаково в обоих направлениях. Наименьшим 6-значным палиндромом, который является произведением двух 3-значных чисел,...

Найти наибольший палиндром
Помогите решить задание... В строке найти наибольший палиндром . Например для cтроки: &quot;ссс сс ссс kl aha&quot; наибольшим...

Найти наибольший общий делитель двух чисел
найти наибольший общий делитель двух чисел с помощью рекурсии и без нее


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru