Умова задачі
Степенем симетрії натурального числа назвемо кількість пар його десяткових цифр, у яких цифри співпадають і розташовані симетрично відносно середини десяткового запису цього числа. Якщо деяка цифра стоїть посередині десяткового запису, її теж треба враховувати у парі з нею самою. Знайти степінь симетрії числа N.
Вхідні дані
У вхідному рядку міститься єдине натуральне число N (N < 2·109).
Вихідні дані
Потрібно вивести єдине число – степінь симетрії числа N.
Ліміт часу: 1 секунда Ліміт використання пам'яті: 64 MiB
Приклад вхідних даних 123322 Приклад вихідних даних 2
Розв'язок 1. Без використання масивів.
1. Щоб знати скільки разів доведеться виконувати порівняння цифр, з яких число складається, визначаємо "довжину" цього числа. Умовно кажучи знайдемо кількість цифр у ньому.
2. Порівнюємо першу та останню цифри. Якщо вони однакові - збільшуємо степінь симетрії на 1.
3. "Вкорочуємо" число відкинувши першу та останню цифри.
4. Повторюємо пункти 2 та 3 визначену за даними отриманими у пункті 1 кількість раз.
1. Програма, що визначає кількість цифр
using System;
class Program
{
static void Main()
{
int N = Convert.ToInt32(Console.ReadLine());
//Знайдемо "довжину" числа
int d = 0; // "довжина" числа поки рівна 0
int a = N; // продублюємо число аби не втратити його початкове значення
do // початок циклу з післяумовою
{
a = a / 10; // укорочуємо число відкинувши останню цифру
d = d + 1; // збільшуємо "довжину" числа на 1
}
while (a >= 1); // умова циклу з післяумовою
Console.Write(d); // шукана "довжина" числа виводиться на екран
Console.ReadLine();
}
}
Доповнимо програму. Допишемо рядки, що піднесуть 10 до степеня довжини числа. Така величина потрібна, щоб відокремлювати першу цифру.
// змінну а використаємо щоб сформувати d-1 степінь числа 10
a = 1; // спочатку а робимо рівною 1
for (int i = 1; i < d; i = i+1) a = a* 10;
Console.WriteLine(a); // шукана степінь числа 10 виводиться на екран
2. Фрагмент коду, що порівнює першу і останню цифри
// N % 10 - остання цифра
// N / a - перша цифра числа
if ((N % 10)==(N /a)) s = s +1; // порівнюємо першу та останню цифру і збільшуємо степінь на 1
Наступний проміжний варіант програми, що виводить на екран 1 якщо перша і остання цифри рівні
using System;
class Program
{
static void Main()
{
int N = Convert.ToInt32(Console.ReadLine());
//Знайдемо довжину" числа
int d = 0; // довжина числа пока рівна 1
int a = N; // продублюємо число аби не втратити його початкове значення
do // початок циклу з післяумовою
{
a = a / 10; // укорочуємо число вікинувши останню цифру
d = d + 1; // збільшуємо "довжину числа на 1
}
while (a >= 1); // умова циклу з післяумовою
// змінну а використаємо повторно щоб сформувати d-1 степінь числа 10
a = 1; // спочатку а робимо рівною 1
for (int i = 1; i < d; i = i+1) a = a* 10;
// змінну s використаємо щоб визначати степінь симетрії
int s = 0; // спочатку а робимо рівною 0
// N % 10 - остання цифра
// N / a - перша цифра числа
if ((N % 10)==(N /a)) s = s +1; // порівнюємо першу та останню цифру і збільшуємо степінь на 1
Console.WriteLine(s); // шукана степінь симетрії числа виводиться на екран
Console.ReadLine();
}
}
3. Фрагмент коду, що "відрізає" першу та останню цифри попередньо зменшивши а в десять раз
a = a / 10; // зменшуемо степінь 10 для наспних "обрізань" та порівнянь
N = N / 10; // вкорочуємо число відкинувши останню цифру
N = N % a; // вкорочуємо число відкинувши першу цифру
Наступний проміжний варіант програми, що виводить на екран "обрізане" число
using System;
class Program
{
static void Main()
{
int N = Convert.ToInt32(Console.ReadLine());
//Знайдемо довжину" числа
int d = 0; // довжина числа пока рівна 1
int a = N; // продублюємо число аби не втратити його початкове значення
do // початок циклу з післяумовою
{
a = a / 10; // укорочуємо число вікинувши останню цифру
d = d + 1; // збільшуємо "довжину числа на 1
}
while (a >= 1); // умова циклу з післяумовою
// Console.WriteLine(d); // шукана "довжина" числа виводиться на екран
// змінну а використаємо повторно щоб сформувати d-1 степінь числа 10
a = 1; // спочатку а робимо рівною 1
for (int i = 1; i < d; i = i+1) a = a* 10;
Console.WriteLine(a); // шукана степінь числа 10 виводиться на екран
// змінну s використаємо щоб визначати степінь симетрії
int s = 0; // спочатку а робимо рівною 0
// N % 10 - остання цифра
// N / a - перша цифра числа
if ((N % 10)==(N /a)) s = s +1; // порівнюємо першу та останню цифру і збільшуємо степінь на 1
Console.WriteLine(s); // шукана степінь симетрії числа виводиться на екран
a = a / 10; // зменшуемо степінь 10 для наспних "обрізань" та порівнянь
N = N / 10; // вкорочуємо число відкинувши останню цифру
N = N % a; // вкорочуємо число відкинувши першу цифру
Console.WriteLine(N); // виводимо "вкорочене" число
Console.ReadLine();
}
}
4. Об'єднуємо "порівняння-обрізання" в цикл
do
{
if ((N % 10)==(N /a)) s = s +1; // порівнюємо першу та останню цифру і збільшуємо степінь на 1
Console.WriteLine(s); // шукана степінь симетрії числа виводиться на екран
a = a / 10; // зменшуемо степінь 10 для наспних "обрізань" та порівнянь
N = N / 10; // вкорочуємо число відкинувши останню цифру
N = N % a; // вкорочуємо число відкинувши першу цифру
Console.WriteLine(N); // виводимо "вкорочене" число
}
while (a>10);
Майже остаточна програма з необхідними для відлагодження виведеннями проміжних результатів
using System;
class Program
{
static void Main()
{
int N = Convert.ToInt32(Console.ReadLine());
//Знайдемо довжину" числа
int d = 0; // довжина числа пока рівна 1
int a = N; // продублюємо число аби не втратити його початкове значення
do // початок циклу з післяумовою
{
a = a / 10; // укорочуємо число вікинувши останню цифру
d = d + 1; // збільшуємо "довжину числа на 1
}
while (a >= 1); // умова циклу з післяумовою
// Console.WriteLine(d); // шукана "довжина" числа виводиться на екран
// змінну а використаємо повторно щоб сформувати d-1 степінь числа 10
a = 1; // спочатку а робимо рівною 1
for (int i = 1; i < d; i = i+1) a = a* 10;
Console.Write("степінь числа 10");
Console.WriteLine(a); // шукана степінь числа 10 виводиться на екран
// змінну s використаємо щоб визначати степінь симетрії
int s = 0; // спочатку а робимо рівною 0
// N % 10 - остання цифра
// N / a - перша цифра числа
do
{
if ((N % 10)==(N /a)) s = s +1; // порівнюємо першу та останню цифру і збільшуємо степінь на 1
Console.Write("степінь симетрії числа ");
Console.WriteLine(s); // шукана степінь симетрії числа виводиться на екран
Console.Write("степінь числа 10 ");
Console.WriteLine(a); // степінь числа 10 виводиться на екран
a = a / 10; // зменшуемо степінь 10 для наспних "обрізань"
N = N / 10; // вкорочуємо число відкинувши останню цифру
N = N % a; // вкорочуємо число відкинувши першу цифру
a = a / 10; // ще зменшуемо степінь 10 для наспних порівнянь
Console.Write("вкорочене число ");
Console.WriteLine(N); // виводимо "вкорочене" число
}
while (a>10);
if ((N % 10)==(N /a)) s = s +1; // порівнюємо цифри, що залишились і збільшуємо степінь на 1
Console.Write("степінь симетрії числа ");
Console.WriteLine(s); // шукана степінь симетрії числа виводиться на екран
Console.ReadLine();
}
}
Програма готова до відправлення
Такий підхід дає лише 70% результату тестів на сайті "Є-олімп"
using System;
class Program
{
static void Main()
{
uint N = Convert.ToUInt32(Console.ReadLine());
uint p;
for (p = 1; p<N; p = p*10);
p = p/10;
uint n = 0;
do
{
if ((N % 10) == (N / p)) n = n+1;
N = N % p;
N = N / 10;
p = p / 100;
}
while (p > 0);
Console.WriteLine(n);
}
}
Розв'язок 1. З використанням рядкової величини як масиву символів
Програма готова до відправлення
using System;
class Program
{
static void Main()
{
string N = Console.ReadLine();
int p = N.Length-1;
int n = 0;
for (int i = 0 ; i < p/2+1; i++)
{
if ((N[p-i]) == (N[i])) n = n+1;
}
Console.WriteLine(n);
}
}
Така програма проходить усі 100% тестів на сайті "Є-олімп"
Завдання
Написати коментарі до цієї програми.
Доповнити програму виведенням проміжних результатів для зручного відлагодження та аналізу.
Підготувати пояснення методів роботи з рядковими величинами. Рекомендую спиратися на матеріали цієї Інтернет-сторінки:http://it.fitib.altstu.ru/neud/cs/index.php?action=show&show=131