Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2019, 12:20   #1
niggainsoul
Пользователь
 
Регистрация: 25.03.2019
Сообщений: 10
По умолчанию Код с Паскаля на С++ ( количество телефонных номеров длины N, набираемых ходом коня)

Пытаюсь переписать код с Паскаля на С++, но не знаю, как исправить то, что i не может передаваться в функцию show. Буду благодарен за помощь.

Pascal:
Код:
Const n = 7;  { цифр в номере }
 
Var
  nNum : Longint;
  i    : Char;
  
Procedure Show(s : String);
Begin
  If Length(s)=n then
  Begin
    Writeln(s);
    Inc(nNum);
  end
  else
    Case s[Length(s)] of
      '0' : Begin
              Show(s+'6');
              Show(s+'4');
            end;
      '1' : Begin
              Show(s+'6');
              Show(s+'8');
            end;
      '2' : Begin
              Show(s+'7');
              Show(s+'9');
            end;
      '3' : Begin
              Show(s+'4');
              Show(s+'8');
            end;
      '4' : Begin
              Show(s+'0');
              Show(s+'3');
              Show(s+'9');
            end;
      '6' : Begin
              Show(s+'0');
              Show(s+'1');
              Show(s+'7');
            end;
      '7' : Begin
              Show(s+'2');
              Show(s+'6');
            end;
      '8' : Begin
              Show(s+'1');
              Show(s+'3');
            end;
      '9' : Begin
              Show(s+'2');
              Show(s+'4');
            end;
    end;
end;
 
Begin
  nNum:=0;
  For i:='1' to '9' do If not (i in ['5','8']) then Show(i);
  Writeln('Всего комбинаций: ',nNum);
end.
С++:
Код:
#include <iostream>
#include <string>
using namespace std;
 
int n;
long nNum = 0;
char i;
 
void show(string s)
{
    if (s.length() == n)
    {
        cout << s;
        nNum++;
    }
    else
    {
        switch (s[s.length()-1])
        {
        case '0':
            show(s + '6');
            show(s + '4');
            break;
 
        case '1':
            show(s + '6');
            show(s + '8');
            break;
 
        case '2':
            show(s + '7');
            show(s + '9');
            break;
 
        case '3':
            show(s + '4');
            show(s + '8');
            break;
 
        case '4':
            show(s + '0');
            show(s + '3');
            show(s + '9');
            break;
 
        case '6':
            show(s + '0');
            show(s + '1');
            show(s + '7');
            break;
 
        case '7':
            show(s + '2');
            show(s + '6');
            break;
 
        case '8':
            show(s + '1');
            show(s + '3');
            break;
 
        case '9':
            show(s + '2');
            show(s + '4');
            break;
 
        }
    }
}
 
int main()
{
     cin >> n;
     
     for (i = '1'; i <= '9'; i++)
     {
         if (!(i >= '5' && i <= '8')) show(i);
     }
     cout << nNum;
    
    system("pause");
    return 0;
}
niggainsoul вне форума Ответить с цитированием
Старый 25.03.2019, 12:36   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Ну напишите, show(string(1, i))
p51x вне форума Ответить с цитированием
Старый 25.03.2019, 13:24   #3
niggainsoul
Пользователь
 
Регистрация: 25.03.2019
Сообщений: 10
По умолчанию

Спасибо большое! Но появилась ещё одна проблема - результат выводится не тот. Не знаете, в чем проблема?
niggainsoul вне форума Ответить с цитированием
Старый 25.03.2019, 13:34   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

дополню.
я бы ещё перевод строки добавил.
Цитата:
Сообщение от niggainsoul Посмотреть сообщение
Код:
Writeln(s);
Цитата:
Сообщение от niggainsoul Посмотреть сообщение
Код:
cout << s;
Код:
cout << s << endl;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2019, 13:37   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от niggainsoul Посмотреть сообщение
Не знаете, в чем проблема?
Например, в том, что в паскале отсекаются 5 и 8, а в С++ 5, 6, 7, 8...
p51x вне форума Ответить с цитированием
Старый 25.03.2019, 13:40   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от niggainsoul Посмотреть сообщение
результат выводится не тот. Не знаете, в чем проблема?
знаю.
вот проблема:

Цитата:
Сообщение от niggainsoul Посмотреть сообщение
Код:
For i:='1' to '9' do If not (i in ['5','8']) then Show(i);
исключены только символы 5 и 8

у вас исключены 5 ,6 ,7 ,8
попробуйте
Код:
         if (!(i == '5' || i == '8')) show(string(1, i));
или, лучше,
Код:
         if ((i != '5' && i != '8')) show(string(1, i));

ДОБАВЛЕНО

Цитата:
Сообщение от p51x Посмотреть сообщение
Например, в том, что в паскале отсекаются 5 и 8, а в С++ 5, 6, 7, 8...
да, за Вами не успеешь!

Последний раз редактировалось Serge_Bliznykov; 25.03.2019 в 13:43.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2019, 13:46   #7
niggainsoul
Пользователь
 
Регистрация: 25.03.2019
Сообщений: 10
По умолчанию

Всем спасибо! Код стал таким:
Код:
#include <iostream>
#include <string>
using namespace std;

int n;
long nNum = 0;
char i;

void show(string s)
{
	if (s.length() == n)
	{
		nNum++;
	}
	else
	{
		switch (s[s.length()-1])
		{
		case '0':
			show(s + '6');
			show(s + '4');
			break;

		case '1':
			show(s + '6');
			show(s + '8');
			break;

		case '2':
			show(s + '7');
			show(s + '9');
			break;

		case '3':
			show(s + '4');
			show(s + '8');
			break;

		case '4':
			show(s + '0');
			show(s + '3');
			show(s + '9');
			break;

		case '6':
			show(s + '0');
			show(s + '1');
			show(s + '7');
			break;

		case '7':
			show(s + '2');
			show(s + '6');
			break;

		case '8':
			show(s + '1');
			show(s + '3');
			break;

		case '9':
			show(s + '2');
			show(s + '4');
			break;

		}
	}
}

int main()
{
	cin >> n;
	 
	 for (i = '1'; i <= '9'; i++)
	 {
		 if (!(i == '5' || i == '8')) show(string(1, i));
	 }
	 cout << nNum << endl;
	
	system("pause");
	return 0;
}
По-моему всё правильно выводит, но почему-то wrong answer на 1 тесте acmp. Что не так?

Вот задача:
Шахматная ассоциация решила оснастить всех своих сотрудников такими телефонными номерами, которые бы набирались на кнопочном телефоне ходом коня. Например, ходом коня набирается телефон 340-49-27. При этом телефонный номер не может начинаться ни с цифры 0, ни с цифры 8.

Требуется написать программу, определяющую количество телефонных номеров длины N, набираемых ходом коня.

Входные данные
Входной файл INPUT.TXT содержит натуральное число N (N ≤ 100).

Выходные данные
В выходной файл OUTPUT.TXT выведите искомое количество телефонных номеров.
niggainsoul вне форума Ответить с цитированием
Старый 25.03.2019, 13:50   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

А 5 почему исключалась?
p51x вне форума Ответить с цитированием
Старый 25.03.2019, 13:57   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от niggainsoul Посмотреть сообщение
Шахматная ассоциация решила оснастить всех своих сотрудников такими телефонными номерами, которые бы набирались на кнопочном телефоне ходом коня. Например, ходом коня набирается телефон 340-49-27. При этом телефонный номер не может начинаться ни с цифры 0, ни с цифры 8.
эту тему видели?
http://programmersforum.ru/showthread.php?t=128224

ну и при N=100 получается ОЧЕНЬ большое число.
оно явно не влезет в long
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2019, 14:05   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А 5 почему исключалась?
exp1.png
цифра "5" может быть только если N=1 (однозначный номер).
во всех остальных случаях на неё нельзя попасть ходом коня и, если с неё начать, дальше продолжить нельзя (т.е. её не может быть в номерах при N>=2).

Цитата:
Сообщение от niggainsoul Посмотреть сообщение
По-моему всё правильно выводит, но почему-то wrong answer на 1 тесте acmp. Что не так?
проверьте, при n=1 ответ должен быть 8

и любопытно, а какой ответ при n=100 ?

Последний раз редактировалось Serge_Bliznykov; 25.03.2019 в 14:10.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен сборщик телефонных номеров из Excel. Интеко Microsoft Office Excel 9 28.02.2018 17:29
Сохранение нескольких телефонных номеров клиента Xezon Общие вопросы по программированию, компьютерный форум 3 22.05.2016 11:56
Ходом коня обойти шахматную доску NхM Рон99 Паскаль, Turbo Pascal, PascalABC.NET 2 02.11.2011 17:17
Импорт телефонных номеров из excel в access jen9tko Microsoft Office Access 0 08.11.2010 15:34
БД телефонных номеров ElenaOrsk Общие вопросы Delphi 0 31.05.2009 12:25