Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
 Аватар для Goffrua
4 / 4 / 0
Регистрация: 30.03.2015
Сообщений: 80

Число, переходящее само в себя, - постоянная Капрекара

05.04.2015, 19:49. Показов 7587. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Не получается решить задачку!
Возьмем четырехзначное число, в котором не все цифры одинаковы, например 6264. Расположим цифры сначала в порядке убывания - 6642; затем, переставив их в обратном порядке, получим 2466. Вычтем последнее число из 6642. На следующем шаге с полученной разностью проделаем тоже самое. Через несколько таких действий получится число, переходящее само в себя и называемое постоянной Капрекара. Требуется написать программу, которая находит эту постоянную и количество шагов для ее получения из заданного четырехзначного числа. Вводится четырёхзначное число, выводится число, получившееся после преобразований (всегда 6174) и кол-во преобразований.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
#include<cstdio>
#include<stdlib.h>
using namespace std;
int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int o;
    string s, t, d;
    int atoi(string s);
    for (int i = 0; s != 6174; i++) {
        t = sort(s[0], s[3]);
        d = sort(s[0], s[3], comp);
        int atoi(string t);
        int atoi(string d);
        s = d - t;
        _itoa(int s);
    }
    cout << 6174 << i;
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.04.2015, 19:49
Ответы с готовыми решениями:

Постоянная Капрекара.
Не понятны входные данные. Добавлено через 23 минуты Решение : #include &lt;iostream&gt; #include &lt;vector&gt; #include...

Постоянная Капрекара
Нужна программа, которая определяет количество этапов, которые нужно выполнить что бы получить постоянную Капрекара. Первоначальное число...

Постоянная Капрекара
Возьмем четырехзначное число, в котором не все цифры одинаковы, например 6264. Расположим цифры сначала в порядке убывания - 6642; затем,...

55
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
07.04.2015, 21:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Байт Посмотреть сообщение
разобрать именно "методом карандашика"
так я ж не отказываю этому методу
я против огульного использования, когда весь листинг с карандашиком
а так, сам часто пользуюсь в узких местах, особенно рекурсия когда выпендривается
0
07.04.2015, 21:56

Не по теме:

Может я чего-то не понял, но все же...

Цитата Сообщение от Goffrua Посмотреть сообщение
Возьмем четырехзначное число, в котором не все цифры одинаковы, например 6264
Шаг 1: Возьмем 9998 - не все цифры одинаковы.
Шаг 2: Получим 8999.
Шаг 3: 9998 - 8999 = 999 и что с этим делать??? :scratch:

0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.04.2015, 22:49
mat_for_c, хороший вопрос.
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
07.04.2015, 23:12
аналогично для 1112 и 2111
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
08.04.2015, 09:26
Цитата Сообщение от mat_for_c Посмотреть сообщение
Шаг 3: 9998 - 8999 = 999 и что с этим делать???
продолжать, нули сохранять

9998 - 8999 = 999 (9990,0999)
9990 - 0999 = 8991 (9981,1899)
9981 - 1899 = 8082 (8820,0288)
8820 - 0288 = 8532 (8532,2358)
8532 - 2358 = 6174 (7641,1467)
6174


с этим что-то еще можно сделать?

Добавлено через 1 минуту
Из Википедии
Производя перестановки цифр и вычитания, нули следует сохранять.
2
 Аватар для Goffrua
4 / 4 / 0
Регистрация: 30.03.2015
Сообщений: 80
08.04.2015, 22:41  [ТС]
Добрый вечер!

Два дня бьюсь . Мои знания на исходе. Уж как не проверяла, всё-равно не идёт. Составила блок-схему, ниже по ней последняя версия программы:
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
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
using namespace std;
int main() {
char str[20];
scanf_s("%s", &str[0]);
int i=0, y=0, z=0, k=0;
 
k=strlen(str);   
 
y = atoi(str);  
for( ; y!=6174; z++) {
for(i=k-1;i>0;i--) { 
for(intj=0;j<i;j++)
if(str[j]>str[j+1])
{
inttt = str[j]; 
str[j] = str[j+1];
str[j+1] = tt;
}
 
} 
 
intM = atoi(str); 
printf("Poslesortirovkipovozrastaniy: %d\n", M);
 
intt = M; 
intr = 0;
while (t != 0)
{
r = r * 10 + t % 10;
t /= 10;// тоже самое, что и t=t/10; 
}
printf("Poslesortirovkipoybivaniy: %i\n", r);
y=r-M;
printf("Raznost: %i\n", y);
 
}
 
printf("Itog: %i", 6174);
 
printf("%i\n",  z);
system("pause");
return 0;
}
Гляньте, пожалуйста! Где у меня ошибка?
Миниатюры
Число, переходящее само в себя, - постоянная Капрекара  
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
08.04.2015, 22:57
Цитата Сообщение от Goffrua Посмотреть сообщение
inttt = str[j];
надеюсь этой опечатки нет в программе?
и кстати не одна она
Цитата Сообщение от Goffrua Посмотреть сообщение
intt = M;
intr = 0;
Цитата Сообщение от Goffrua Посмотреть сообщение
y = atoi(str); *
for( ; y!=6174; z++)
Цитата Сообщение от Goffrua Посмотреть сообщение
y=r-M;
printf("Raznost: %i\n", y);
а где ты y превращаешь опять в строку? веди сортировка то идет строки!!!
нужно что то типа
C++
1
sprintf(str,"%.4d",i);
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
09.04.2015, 00:46
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
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
using namespace std;
 
int main (void){
 
    const int N=5;      //5 символ - признак окончания строки
    int k=0;            //Эту переменную используем для цикла и одновремнно для подсчета шагов
 
    char str[N]="";       //Исходное число в str, ниже str1 и str2 вспомогательные - отсортированные
    gets(str);
    str[N-1]='\0';
 
    char str1[N],str2[N];         //Вспомогательные будут отсортированы
 
for (k=0;k<7;k++){         // можно Не более чем за 7 шагов (так в википедии пишут)
    strcpy(str1,str);       //В str1 записали начальное для его сортровки
  
 /*Сортировка по  убыванию*/
   for (int i=1;i<N;i++){
    for (int j=0;j<N-1;j++){
        if (str1[i]>str1[j]) swap(str1[i],str1[j]);
    }
   }
/*теперь в str1 число собранное из цифр по убыванию*/
//можно не сортировать снова
//Число 4-х значное можно и напрямую повтыкивать. Быстрее чем сортировка (операций меньше)
   for (int i=0;i<4;i++) str2[i]=str1[N-2-i];
   str2[N-1]='\0'; //ПРизнак конца строки
/*
   в цикле происходит вот это:
   str2[0]=str1[3];
   str2[1]=str1[2];
   str2[2]=str1[1];
   str2[3]=str1[0];
   после цикла
   str2[4]='\0'; //Конец строки - признак конца строки
*/
 
 
    int x=atoi(str1)-atoi(str2);  //Разность двух полученных чисел
 
   strcpy(str,"0000"); //Для сохранения нулей
 
 //Собираем str из полученной разности
   str[3]=x%10+48;  //48 - это ASCII код нуля, чтобы привести число к строке есть itoa, но оно не стандарт
   str[2]=x/10%10+48; //поэтому таким не казистым способом, прибавляя 48 к числу
   str[1]=x/100%10+48; //и приводя это к char
   str[0]=x/1000%10+48; //приведение происходит неявно, но т.к. присваивание в char, то оно есть
 
cout<<"== "<<str<<" ==\n"; //Выводим на экран текущую разность
 if (!strcmp("6174",str)) break; //Если текущая разность равна постоянной, выходим из цикла
} //for k
 
cout<<"Count steps = "<<k+1<<"\n"; //Сообщаем результат
 
 return 0;
}

Не по теме:

//Собираем str из полученной разности
Это там число разбивается таким образом, чтобы получать его цифры по одной

1
09.04.2015, 01:54

Не по теме:

Посмотрел на объемы кода и решил тоже попускать пузырьки :)

Haskell
1
2
3
task n i = if n' == n then (n, i) else task n' (i+1) where
    n' = read (take 4 $ reverse s ++ "0000") - read s
    s  = sort $ show n

0
 Аватар для Goffrua
4 / 4 / 0
Регистрация: 30.03.2015
Сообщений: 80
09.04.2015, 07:12  [ТС]
ValeryS, daslex, _Ivana, спасибо, что "не прошли мимо"!

ValeryS, в программе ничего не слеплено. Только что проверила.
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
09.04.2015, 07:47
Решение задачи на постоянную Капрекару
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
09.04.2015, 08:32
Цитата Сообщение от Goffrua Посмотреть сообщение
в программе ничего не слеплено. Только что проверила.
надеюсь иначе была бы ошибка компиляции
0
 Аватар для Goffrua
4 / 4 / 0
Регистрация: 30.03.2015
Сообщений: 80
10.04.2015, 21:17  [ТС]
Всем добрый вечер!
daslex, супер, Ваша программа прошла с 1 раза! Я "сплагиатила" у Вас кусочек проги :
Цитата Сообщение от daslex Посмотреть сообщение
C
1
strcpy(str,"0000"); //Для сохранения нулей
Цитата Сообщение от ValeryS Посмотреть сообщение
а где ты y превращаешь опять в строку? веди сортировка то идет строки!!!
нужно что то типа

C++
1
sprintf(str,"%.4d",i);
ValeryS, точно, прошляпила..


И всё-таки пытаюсь добить программу в своей редакции, первоначальной. Практически всё считает, осталось поудалять лишнее, чтобы решение покороче было.
Пока я борюсь...

Добавлено через 23 часа 14 минут
ValeryS, gunslinger, _Ivana, daslex, Байт, mat_for_c, Day, nmcf, hoggy, zss, senyaarseniy, S_el, благодарю за поддержку!

Всем спасибо, кто помогал мне! Программа составлена! Я её столько раз переделывала, редактировала, меняла, что теперь могу её написать даже с закрытыми глазами . У меня всё получилось только благодаря вам!


Не по теме:

P.S. пойду ещё сложные задачки выбирать, чтобы не уходить от вас)

3
10.04.2015, 22:33

Не по теме:

Цитата Сообщение от Goffrua Посмотреть сообщение
Я её столько раз переделывала, редактировала, меняла, что теперь могу её написать даже с закрытыми глазами
У Николая Гумилева есть на этот счет маленький стишок.
Мальчик, мальчик, как ты весел! Как светла твоя улыбка!
Не проси об этом счастье, отравляющем миры.
Ты не знаешь, ты не знаешь, что такое - эта скрипка,
Что такое - тихий ужас начинателя игры.
Тот, кто взял ее однажды в повелительные руки,
Для того пропал навеки безмятежный свет очей.
Духи ада любят слушать эти царственные звуки,
Бродят бешеные волки по дорогам скрипачей
...
...
Мальчик, мальчик, не ищи там ни утехи, ни сокровищ!
Но я вижу - ты смеешься? Твои взгляды - два луча!
На! - владей волшебной скрипкой! Посмотри в глаза чудовищ.
И погибни страшной смертью - славной смертью скрипача!

0
10.04.2015, 23:01  [ТС]

Не по теме:

Цитата Сообщение от 8-BITOV Посмотреть сообщение

Не по теме:

У Николая Гумилева есть на этот счет маленький стишок.
Мальчик, мальчик, как ты весел! Как светла твоя улыбка!
Не проси об этом счастье, отравляющем миры.
Ты не знаешь, ты не знаешь, что такое - эта скрипка,
Что такое - тихий ужас начинателя игры.
Тот, кто взял ее однажды в повелительные руки,
Для того пропал навеки безмятежный свет очей.
Духи ада любят слушать эти царственные звуки,
Бродят бешеные волки по дорогам скрипачей
...
...
Мальчик, мальчик, не ищи там ни утехи, ни сокровищ!
Но я вижу - ты смеешься? Твои взгляды - два луча!
На! - владей волшебной скрипкой! Посмотри в глаза чудовищ.
И погибни страшной смертью - славной смертью скрипача!

Это точно! :good:

0
0 / 0 / 0
Регистрация: 10.02.2016
Сообщений: 2
25.05.2016, 18:37
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <conio.h>
#include<windows.h>
using namespace std;
 
int main()
{
  
    int x;
    int n=0;
      int y;
 
   int num1, a,
       num2, b,
       num3, c,
       num4, d;
 
   cout<<"  Enter Number Format - ####:  ";
   cin>>num1;
  while(num1!=6174)
  {
      a = num1 / 1000;
      num2 = num1 % 1000;
      b = num2 / 100;
      num3 = num2 % 100;
      c = num3 / 10;
      num4 = num3 % 10;
      d = num4 / 1;
      
      
    do  
      {
      if(a<b)
      {
      x=a;
      a=b;
      b=x;
      }
      if(b<c)
      {
      x=b;
      b=c;
      c=x;
      }
      if(c<d)
      {
      x=c;
      c=d;
      d=x;
      }
      }
       while((a<b)||(b<c)||(c<d));
      cout<<"  Res:  "<<a<<b<<c<<d<<endl;
      num2=a*1000+b*100+c*10+d;
      num3=d*1000+c*100+b*10+a;
      num1=num2-num3;
      cout<<" "<<num2<<" - "<<num3<<" = "<<num1<<endl;
      n++;
      }
      cout<<"  Res:  6174"<<endl;
      cout<<" 7641 - 1467 = 6174"<<endl;
      cout<<n<<endl;
      getch();
   return 0;
}
Вроде работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.05.2016, 18:37

Постоянная Капрекара
Здравствуйте, помогите, пожалуйста с последней функцией kaprekar_loop. Задание с ресурса Степик, первые две функции «numerics(n)» и...

Проверить простое ли число? (число называется простым, если оно делится только само на себя и на 1)
Проверить простое ли число? (число называется простым, если оно делится только само на себя и на 1) Используя только циклы

Является ли введенное число с клавиатуры простым т. е. делится только на само себя и еденицу
Помогите пожалуйста. Является ли введенное число с клавиатуры простым т. е. делится только на само себя и еденицу.

Найти сумму простых чисел до N простое число, которое делится только на 1 и на само себя
Задано целое число N. Найти сумму простых чисел до N. простое число, которое делиться только на 1 и на самого себя

Составить процедуру, определяющую является ли заданное число простым, т.е. делящимся только на 1 и на само себя
Помогите написать программу &quot;Составить процедуру, определяющую является ли заданное число простым, т.е. делящимся только на 1 и на само...


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

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
Новые блоги и статьи
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru