C/C++

Определить k-ю цифру последовательности 182764125216343 … , в которой выписаны подряд кубы натуральных чисел.

С++
Определить k-ю цифру последовательности
182764125216343 … ,
в которой выписаны подряд кубы натуральных чисел.
Попроще пожалуйста и с объяснением плиз
Seriy Cavalji
Seriy Cavalji
240
Лови на 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();
}
НН
Николай Николай
61 042
Лучший ответ
А я вот что предлагаю сделать:
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;
}
}
Юрий Григорьев (✿^‿^) Гг, ошибки, бли-и-ин!. Сказала же, что цикл надо делать до 2642245, а у самой только до 2600000. В общем, это надо исправить! Но тогда длины 48000000 для массива digits не хватит, должно быть digits[48824255];
А в остальном всё правильно! 。◕‿◕。

Похожие вопросы