Задача С. N-та цифра
Ім’я вхідного
файлу: іnput.txt
Ім’я вхідного
файлу: output.txt
Ліміт часу: 1с.
Дано початковий
рядок 1, над яким застосовують наступну операцію: приписують праворуч такий же
рядок, але з заміною нулів на одиниці, а одиниць на нулі. Цю операцію
повторюють нескінченну кількість разів. Ваше завдання полягає в знаходженні
N-тої цифри в отриманому рядку.
Вхідні дані
В першому рядку
записано кількість тестів K. В наступних K рядках записано число N, номер цифри
в K-му рядку (1≤K≤100, 1≤N≤1000000000).
Вихідні дані
В результаті
вивести K рядків, в кожному з яких N-та цифра, відповідного рядка.
Приклади
іnput.txt
|
output.txt
|
1
7
|
1
|
2
1
2
|
1
0
|
Ідея.
Задача потребує
побудови числа, щоб в ньому відшукати потрібну цифру. Однак, будувати числа для
кожного тесту – це суттєве уповільнення програми. Тому краще знайти серед
заданих номерів для цифр – найбільший номер, і побудувати для нього число. За умовою задачі числа конструюються так, що всі цифри після
свого створення, які мають менші номери, - позицій не змінюють. Отже,
побудувавши число - в ньому можна знайти позиції цифр для кожного тесту.
Алгоритм:
1. Прочитати
кількість тестів.
2. Записати номери
цифр у масив nom_digits.
3. Знайти
максимальний номер серед номерів цифр (знайти максимальний елемент масиву nom_digits).
4. Поки довжина
числа (масиву) v менша за максимальний номер
цифри:
дописати
цифри в кінець масиву v, інвертуючи
їх (1 на 0, 0 на 1).
5. З побудованого
масиву v вивести лише ті цифри, номери, яких знаходяться в nom_digits:
printf( "%d\n", v[ nom_digits[i]-1 ] )
Особливості реалізації:
1) для інвертування цифр використовується формула
нова_цифра=1-стар_цифра. де стара_цифра це 1 або 0;
2) nom_digits[i]-1 – потрібно
віднімати 1, бо індекси масива починаються з 0, а номери цифр в умові задачі
розглядаються починаючи від 1;
3) індексом масива може бути значення елемента
іншого масива: v[ nom_digits[i]-1 ] – тобто у числі v номер цифри nom_digits[i]-1.
#include <stdio.h>
#include <vector>
using namespace std;
vector<int> v;
vector<int> nom_digits;
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int k;
scanf("%d", &k);
nom_digits.assign(k,0);
for(int test=0; test<k; ++test){
int n;
scanf("%d", &n);
nom_digits[test]=n;
}
int max_n_ndx = 0;
for(int i=0; i<(int)nom_digits.size(); ++i)
if(nom_digits[i]>nom_digits[max_n_ndx])
max_n_ndx = i;
v.push_back(1);
while((int)v.size()<nom_digits[max_n_ndx])
{
int size = (int)v.size();
for (int i = 0; i < size; ++i)
v.push_back(1 - v[i]);
}
for(int i=0; i<(int)nom_digits.size(); ++i)
printf("%d\n", v[nom_digits[i]-1]);
return 0;
}
Немає коментарів:
Дописати коментар