Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Александр228 из
0 / 0 / 0
Регистрация: 09.01.2019
Сообщений: 5
1

Написать программу, которая сможет дать ответ, сколько существует чисел-палиндромов для заданного числа...

22.01.2019, 00:09. Просмотров 884. Ответов 17
Метки нет (Все метки)

Куратор называет любое натуральное число X, а Роберт должен ответить, сколько существует чисел-палиндромов ⩽X. Помогите Роберту написать программу, которая сможет дать ответ на такие запросы.
Первая и единственная строка содержит число X(1⩽X⩽100000)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2019, 00:09
Ответы с готовыми решениями:

Написать программу, которая для заданного натурального числа
Написать программу, которая для заданного натурального числа: • определяет число, полученное...

Определить, сколько существует чисел-палиндромов, не больших заданного X
Куратор называет любое натуральное число X, а Роберт должен ответить, сколько существует...

Для заданного числа Н(1<Н<10000) написать программу, которая находит все совершенные числа, меньшие Н
Число называется совершенным,если сумма его делителей (кроме него самого) равна этому числи....

Написать программу, которая для заданного целого числа а печатает таблицу
2) Написать программу, которая для заданного целого числа а печатает таблицу, используя только...

Написать программу, которая для заданного целого числа а печатает таблицу
а а3 а6 а6 а3 а

17
D3m1an
200 / 154 / 77
Регистрация: 11.08.2016
Сообщений: 554
Завершенные тесты: 1
22.01.2019, 00:48 2
Александр228 из, Очень много вариантов решения на форуме, если пользоваться поиском.
0
Байт
Эксперт C
20645 / 13137 / 2769
Регистрация: 24.12.2010
Сообщений: 27,630
22.01.2019, 14:47 3
Александр228 из, Что означают квадратики? "<=", да?
Вообще-то следует воспользоваться тем, что чисел-палиндромов значности 2n имеется 9*10n-1, Значности 2n+1 - 9*10n
Некоторые трудности представляет подсчет числа палиндромов значности равной значности X
Один из путей - генерировать их. Учитывая, что палиндром однозначно определяется своей первой половиной (+1 для неметной значности)
0
L0M
792 / 390 / 198
Регистрация: 01.10.2018
Сообщений: 822
Завершенные тесты: 1
23.01.2019, 02:01 4
Тупо пробежаться по всему диапазону 0..Х и проверить каждое число:
C++
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
#include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
 
bool isPalindrome(size_t num) {
    stringstream ss;
    ss << num;
    string str = ss.str();
    size_t idx_last = str.length() - 1;  // индекс последнего символа строки
    for (size_t i = 0; i < str.length() / 2; ++i)
        if (str[i] != str[idx_last - i])
            return false;
    return true;
}
 
int main() {
    size_t X;
    cin >> X;
    size_t counter = 0;
    for (size_t i = 1; i <= X; ++i) {
        if (isPalindrome(i)) {
            // cout << i << endl;       // контрольная печать палиндромов
            ++counter;
        }
    }
    cout << counter << endl;
}
0
23.01.2019, 02:01
Catstail
Модератор
24532 / 12449 / 2274
Регистрация: 12.02.2012
Сообщений: 20,206
23.01.2019, 10:21 5
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int isPal(int n)
{
    int r=0,nn=n;
    if (n < 10) return 1;
    while(nn>0)
    {
        r=r*10+nn%10;
        nn=nn/10;
    }
    return (n==r);
}
int main(void) {
    int i,X,c=0;
    scanf("%d",&X);
    for (i=1; i<=X; i++) if (isPal(i)) c++;
    printf("%d\n",c);
    return 0;
}

https://ideone.com/lfZjj9
1
Байт
Эксперт C
20645 / 13137 / 2769
Регистрация: 24.12.2010
Сообщений: 27,630
23.01.2019, 13:27 6
Цитата Сообщение от L0M Посмотреть сообщение
Тупо пробежаться по всему диапазону 0..Х и проверить каждое число:
Можно, конечно. И задачу это решает... Но вы же сами заметили... Неинтересно, как-то...

Добавлено через 17 минут
Вот код для подсчета четно-значных палиндромов
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int p=10, count=0;
for(k=1; ; k++) {
  if (k==p) 
     p *= 10;
  r = 0;
  kk = k;
  while(kk) {
    r = 10*r + kk%10;
    kk /= 10;
  }
  n = k*p + r;
  if (n > X) break;
  count++;
}
Добавка нечетно-значных оставляется любителям "извращений" в качестве упражнения.
1
analogov net
202 / 145 / 75
Регистрация: 17.11.2018
Сообщений: 399
25.01.2019, 01:58 7
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    int n, count;
 
    scanf( "%d", &n );
    for( count = n < 10 ? n : 9; n > 10; n-- )
        if     ( n < 100    )  count += n / 10   == n % 10;
        else if( n < 1000   )  count += n / 100  == n % 10;
        else if( n < 10000  )  count += n / 100  == n % 100;
        else if( n < 100000 )  count += n / 1000 == n % 100;       
    
    printf( "%d\n", count );
    return 0;
}
1
stake-k26
676 / 467 / 355
Регистрация: 25.04.2016
Сообщений: 1,333
25.01.2019, 12:19 8
analogov net, программа считает правильно, но только до чисел меньше 1000. дальше она считает непонятно что, и лишь по чистой случайности она выводит правильный ответ.

Для теста написал небольшую программу:
C
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
#include <stdio.h>
int isPalindrome (int);
int isPal (int);
/* http://www.cyberforum.ru/c-beginners/thread2392345.html */
int main (void)
{
    int key, n;
    printf("(1000 <= N <= 100 000) N = ");
    scanf("%d", &n);
    if (n<1000 || n>100000) return 1;
    printf("Какой способ? 1 - быстрый, 2 - медленный: ");
    scanf("%d", &key);
    if (key<1 || key>2) key = 2;
 
    int i, cnt = 0;
    for (i=1000; i<n; i++)
        if (key < 2? isPal(i) : isPalindrome(i))
            if (++cnt % 11)
                printf("%7d", i);
            else
                printf("%7d\n", i);
 
    printf("\n\nНа промежутке от 1000 до %d встречается %d палиндромов\n", n, cnt);
    return 0;
}
// ---- Проверка на палиндром - медленный способ ----
int isPalindrome (int n)
{
    if (n < 10) return 1;
    else if (n < 100) return n/10 == n%10;
    else
    {
        int a, x=0;
        for (a=n; a; a/=10)
            x = x*10 + a%10;
        return x == n;
    }
}
// ---- Проверка на палиндром - быстрый способ ----
int isPal (int n)
{
    if (n < 10) return n/1 == n%10;
    else if (n < 100) return n/10 == n%10;
    else if (n < 1000) return n/100 == n%10;
    else if (n < 10000) return n/100 == n%100;
    else if (n < 100000) return n/1000 == n%100;
    else return n/1000 == n%1000;
}
Пример работы:
число 1214, ваш способ:
1010 1111 1212
На промежутке от 1000 до 1214 встречается 3 палиндромов

число 1214, правильный способ:
1001 1111
На промежутке от 1000 до 1214 встречается 2 палиндромов

Никакой разницы не замечаете? Каким образом число 1212 оказалось палиндромом?

Байт, Catstail, приведу пример на коде Байта:
Цитата Сообщение от Байт Посмотреть сообщение
C
1
2
3
4
5
kk = k;
while(kk) {
    r = 10*r + kk%10;
    kk /= 10;
}
а не лучше обычный for?
C
1
2
for (kk=k; kk; kk/=10)
    r = 10*r + kk%10;
куда компактнее и весь алгоритм сразу перед глазами, а не разбросан по строкам
1
Байт
Эксперт C
20645 / 13137 / 2769
Регистрация: 24.12.2010
Сообщений: 27,630
25.01.2019, 12:26 9
Цитата Сообщение от stake-k26 Посмотреть сообщение
а не лучше обычный for?
Один и тот же алгоритм в языке Си, даже самый простой, можно записать десятком различных способов. И я не вижу смысла в обсуждении этих способов, а тем более в сравнении их по качеству.
1
stake-k26
676 / 467 / 355
Регистрация: 25.04.2016
Сообщений: 1,333
25.01.2019, 12:27 10
...

Добавлено через 53 секунды
Да как бы не о качестве речь, а о наглядности качество-то у них одно и то же
0
analogov net
202 / 145 / 75
Регистрация: 17.11.2018
Сообщений: 399
25.01.2019, 13:15 11
Цитата Сообщение от stake-k26 Посмотреть сообщение
Каким образом число 1212 оказалось палиндромом?
А это замаскированный палиндром.
Да, придётся поработать над собой.

Добавлено через 46 минут
Цитата Сообщение от Александр228 из Посмотреть сообщение
Написать программу, которая сможет дать ответ, сколько существует чисел-палиндромов для заданного числа...
stake-k26, программа правильно считает, а выводить на экран она не обязана. Такого условия в задании нет.
Цитата Сообщение от stake-k26 Посмотреть сообщение
Каким образом число 1212 оказалось палиндромом?
Цитата Сообщение от analogov net Посмотреть сообщение
А это замаскированный палиндром.
например она 1212 посчитает, как палиндром, а 1221 нет. вот и весь фокус.
1
stake-k26
676 / 467 / 355
Регистрация: 25.04.2016
Сообщений: 1,333
25.01.2019, 14:10 12
analogov net, никакие оправдания не помогут, если программа работает неправильно.

Цитата Сообщение от analogov net Посмотреть сообщение
например она 1212 посчитает, как палиндром, а 1221 нет. вот и весь фокус.
А то, что на одном и том же промежутке она выдаст разный ответ, это тоже фокус такой? В тестовой программе лишь для наглядности использован сразу промежуток от 1000, на котором начинаются ошибки, измените начало в цикле на 1, и увидите, что ваша программа считает как повезет, до 1000 всегда правильно, а дальше,.. а вот дальше одни сплошные фокусы.

Например, пусть у нас N = 1005, правильная проверка выдаст 109 палиндромов, а ваша - 108.. ну и в каком месте
Цитата Сообщение от analogov net Посмотреть сообщение
программа правильно считает
??
0
analogov net
202 / 145 / 75
Регистрация: 17.11.2018
Сообщений: 399
25.01.2019, 15:52 13
Цитата Сообщение от stake-k26 Посмотреть сообщение
никакие оправдания не помогут, если программа работает неправильно.
Это точно.

Цитата Сообщение от stake-k26 Посмотреть сообщение
до 1000 всегда правильно, а дальше,.. а вот дальше одни сплошные фокусы

Будем исправлять, вернее попытаемся:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    int n, count;
 
    scanf( "%d", &n );
    for( count = n < 10 ? n : 9; n > 10; n-- )
        if     ( n < 100    )  count += n / 10    == n % 10;
        else if( n < 1000   )  count += n / 100   == n % 10;
        else if( n < 10000  )  count += n / 1000  == n % 10 && n / 100  % 10 == n % 100 / 10;
        else if( n < 100000 )  count += n / 10000 == n % 10 && n / 1000 % 10 == n % 100 / 10;
 
        printf( "%d\n", count );
        return 0;
}
1
Байт
Эксперт C
20645 / 13137 / 2769
Регистрация: 24.12.2010
Сообщений: 27,630
25.01.2019, 18:59 14
analogov net, я, к сожалению, так и не собрался разобраться в вашем замечательном цикле из поста 7. Однако, сразу кольнуло подозрение, что он прекрасно сработает для палиндромов, значность которых меньше Х, а для тех, кто совпадает с его значностью, нужна отдельная работа.
Но подход ваш, имхо, правильный. Там, где можно посчитать аналитически-логически-алгебраически, да на фиг пошел весь ваш перебор! Но в интервале 10k < X <= 10k+1, там могут быть тонкости. Хотя и там, как мне кажется, можно не очень сложными путями получить правильный ответ вовсе без перебора.
Удачи вам!

Добавлено через 2 минуты
Хотя, конечно, штуки подобные
C
1
2
if (n <100) ..
else if (n<1000) ..
наводят тоску
1
stake-k26
676 / 467 / 355
Регистрация: 25.04.2016
Сообщений: 1,333
25.01.2019, 19:12 15
analogov net, ну вот, совсем другое дело.

Добавлено через 3 минуты
Цитата Сообщение от Байт Посмотреть сообщение
наводят тоску
в любом случае это быстрее, чем цикл гонять.
0
analogov net
202 / 145 / 75
Регистрация: 17.11.2018
Сообщений: 399
25.01.2019, 20:18 16
Цитата Сообщение от Байт Посмотреть сообщение
analogov net, я, к сожалению, так и не собрался разобраться в вашем замечательном цикле из поста 7
Байт, дело в том, что я написал его за 5 минут, а потестить, как следует, как всегда времени и желания нет. Да, по правде говоря, мне и не нужно это делать. Я проверил несколько значений и всё. Это ведь, как говорится у тебя в подписи, только идея, к которой нужно относится творчески. А дальше, кто хочет, напильник в зубы и вперёд.

Цитата Сообщение от Байт Посмотреть сообщение
Но подход ваш, имхо, правильный. Там, где можно посчитать аналитически-логически-алгебраически, да на фиг пошел весь ваш перебор!
Да, в этом и была задумка. Не всё получилось с первого раза, но для того тестирование и существует.
stake-k26, молодец, что не поленился и проверил, хотя оставил ТС без домашнего задания.
А у меня тут, с утра, полно гостей дома, а мне нужно было ошибки в коде исправлять.
Ну, что бы скучно не было, есть ещё вариант:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define isPal( a, b ) ( !strcmp( a, _strrev( b = _strdup( a ))))
int main()
{ 
    int  n     ,  count;
    char buf[7], *p;
 
    scanf( "%d", &n );   
    for( count = n < 10 ? n : 9; n > 10; n-- ) {
        count += isPal( _itoa( n, buf, 10 ), p );
        free( p );
    }
    printf( "%d\n", count );   
    return 0;
}
1
Байт
25.01.2019, 20:28
  #17

Не по теме:

Цитата Сообщение от analogov net Посмотреть сообщение
А у меня тут, с утра, полно гостей дома,
Если одну из твоих близких женщин зовут Татьяной, передай ей личный от меня привет и с днем ангела! Если нет - все равно привет передай.

0
analogov net
202 / 145 / 75
Регистрация: 17.11.2018
Сообщений: 399
25.01.2019, 20:32 18
Цитата Сообщение от Байт Посмотреть сообщение
Если одну из твоих близких женщин зовут Татьяной, передай ей личный от меня привет и с днем ангела! Если нет - все равно привет передай.
спасибо
0
25.01.2019, 20:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2019, 20:32

Написать программу, которая вычисляет, сколько лет сможет полноценно обеспечивать электроэнергией электростанция мощностью N киловатт
Написать программу, которая вычисляет, сколько лет сможет полноценно обеспечивать электроэнергией...

Написать программу, которая для заданного целого числа печатает следующую таблицу
Помогите, пожалуйста. 1. Написать программу, которая для заданного целого числа печатает...

Написать программу, которая для заданного с клавиатуры числа А ищет корень уравнения f(x)=0
Написать программу, которая для заданного с клавиатуры числа А ищет корень уравнения f(x)=0. ...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru