С++
Определить k-ю цифру последовательности
182764125216343 … ,
в которой выписаны подряд кубы натуральных чисел.
Попроще пожалуйста и с объяснением плиз
C/C++
Определить k-ю цифру последовательности 182764125216343 … , в которой выписаны подряд кубы натуральных чисел.
Лови на C#, переведи на плюсы - отличия синтаксиса минимальные
static int GetDigit(int n, int DigitNo)
{
int Len = (int)Math.Log10(n);
int Cnt = Len - DigitNo;
while (Cnt-- >= 0)
n /= 10;
return n % 10;
}
static void Main(string[] args)
{
int CurrentPosition = 1; //Текущая позиция в последовательности
int CurrentCube = 1; //Значение куба
int CurrentBase = 1; //То, что возводится в куб
int CurrentLength = 1; //Длина значения куба
int k = int.Parse(Console.ReadLine()); // Ввод того самого к
do
{
Console.Write(CurrentCube); //Вывод последовательности
if (k <= CurrentPosition + CurrentLength -1) //Наша к найдена
{
Console.WriteLine("\n{0}", GetDigit(CurrentCube, k - CurrentPosition + 1));
break;
}
CurrentBase++; //Следующее число для возведения в куб
CurrentPosition += CurrentLength; //Следующая позиция
CurrentCube = CurrentBase * CurrentBase * CurrentBase; //Куб
CurrentLength = (int)Math.Log10(CurrentCube) + 1; //Длина куба
}
while (true); //Не заканчиваем, пока не получим результат.
Console.ReadLine();
}
static int GetDigit(int n, int DigitNo)
{
int Len = (int)Math.Log10(n);
int Cnt = Len - DigitNo;
while (Cnt-- >= 0)
n /= 10;
return n % 10;
}
static void Main(string[] args)
{
int CurrentPosition = 1; //Текущая позиция в последовательности
int CurrentCube = 1; //Значение куба
int CurrentBase = 1; //То, что возводится в куб
int CurrentLength = 1; //Длина значения куба
int k = int.Parse(Console.ReadLine()); // Ввод того самого к
do
{
Console.Write(CurrentCube); //Вывод последовательности
if (k <= CurrentPosition + CurrentLength -1) //Наша к найдена
{
Console.WriteLine("\n{0}", GetDigit(CurrentCube, k - CurrentPosition + 1));
break;
}
CurrentBase++; //Следующее число для возведения в куб
CurrentPosition += CurrentLength; //Следующая позиция
CurrentCube = CurrentBase * CurrentBase * CurrentBase; //Куб
CurrentLength = (int)Math.Log10(CurrentCube) + 1; //Длина куба
}
while (true); //Не заканчиваем, пока не получим результат.
Console.ReadLine();
}
А я вот что предлагаю сделать:
1. Берём стандартный беззнаковый восьмибайтный целый тип unsigned long long. Максимальное число, им выражаемое, - это 2⁶⁴-1. Берём целую часть из кубического корня этого числа ³√(2⁶⁴-1) - это такое целое число, куб которого ещё можно записàть указанным типом, оно равно 2642245.
2. Делаем глобальные переменные: index и массив digits для цифр кубов, для которого хватает 48 миллионов цифр, записываемых типом unsigned char.
3. В цикле от 1 до 26422245 вычисляем все кубы и записываем их цифры в массив digits.
4. Потом вводим номера и смотрим, какие цифры им соответствуют. Доступна правильная выдача цифр по номерам до чуть меньше чем 48000000.
#include <iostream>
using namespace std;
int index = 0;
unsigned char digits[48000000];
void number(unsigned long long n)
{
int i, k = 0, kminus;
unsigned char cifras[20];
while (n)
{
cifras[k] = n % 10;
k++;
n /= 10;
}
kminus = k - 1;
for (i = 0; i < k; i++)
digits[index + i] = cifras[kminus - i];
index += k;
}
int main()
{
unsigned long long i, n;
for (i = 1; i <= 2600000; i++)
{
n = i * i * i;
number(n);
}
cout << 1 << " ≤ n ≤ " << index << endl;
while (true)
{
cout << "n = ?\b";
cin >> n;
cout << (int) digits[n - 1] << endl;
}
}

1. Берём стандартный беззнаковый восьмибайтный целый тип unsigned long long. Максимальное число, им выражаемое, - это 2⁶⁴-1. Берём целую часть из кубического корня этого числа ³√(2⁶⁴-1) - это такое целое число, куб которого ещё можно записàть указанным типом, оно равно 2642245.
2. Делаем глобальные переменные: index и массив digits для цифр кубов, для которого хватает 48 миллионов цифр, записываемых типом unsigned char.
3. В цикле от 1 до 26422245 вычисляем все кубы и записываем их цифры в массив digits.
4. Потом вводим номера и смотрим, какие цифры им соответствуют. Доступна правильная выдача цифр по номерам до чуть меньше чем 48000000.
#include <iostream>
using namespace std;
int index = 0;
unsigned char digits[48000000];
void number(unsigned long long n)
{
int i, k = 0, kminus;
unsigned char cifras[20];
while (n)
{
cifras[k] = n % 10;
k++;
n /= 10;
}
kminus = k - 1;
for (i = 0; i < k; i++)
digits[index + i] = cifras[kminus - i];
index += k;
}
int main()
{
unsigned long long i, n;
for (i = 1; i <= 2600000; i++)
{
n = i * i * i;
number(n);
}
cout << 1 << " ≤ n ≤ " << index << endl;
while (true)
{
cout << "n = ?\b";
cin >> n;
cout << (int) digits[n - 1] << endl;
}
}

Похожие вопросы
- Дано не менее 3-х различных натуральных чисел, за которыми следует 0. Определить 3 наибольших числа в последовательности
- Определить встречается ли в последовательности группа букв 'one', определить последнее вхождение этой группы
- Задача по Массивах С++ Дано натуральное число N...
- На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
- С++. БЕЗ ИСПОЛЬЗОВАНИЯ АДРЕСОВ И УКАЗАТЕЛЕЙ. Пусть дано натуральное число n и вещественная матрица размером n x 10.
- Заданы натуральное число n и действительные числа a1, a2, …, an. Вычислить
- Язык си Найти все делители натурального числа N и вывести их в порядке возрастания и убывания.
- Написать рекурсивную процедуру для записи натурального числа в обратном порядке
- C++ Дано натуральное число N. Вычислить
- Напишите рекурсивную функцию, которая принимает двухмерный массив целых чисел и количество сдвигов и выполняет
А в остальном всё правильно! 。◕‿◕。