Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
BlackRock
1 / 1 / 0
Регистрация: 13.02.2015
Сообщений: 30
1

Вывод определенной цифры в числовой последовательности

22.09.2016, 08:12. Просмотров 1485. Ответов 36
Метки нет (Все метки)

Доброе утро форумчане, решал задачки для бегинеров на c++ и столкнулся с задачей, до которой никак не могу допереть.

Пользователь вводит натуральное k с клавиатуры, программа выводит k-ую цифру(именно цифру), из последовательности квадратов натуральных чисел вида 1491625.... Не могу допереть, прошу вашей помощи, если можно с комментариями.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2016, 08:12
Ответы с готовыми решениями:

Обработка числовой последовательности
Только начали изучать С++ сразу влипили задачу на обработку числовой последовательности), давали...

Минимум и максимум числовой последовательности
Добрый вечер,нужна помощь в написании следующий программы: дано натуральное чисто n и мы вводи...

Из числовой последовательности найти удалить элементы
Вот такая ситуация... Дани лабораторную, решил её через индексы (нужно использовать STL Deque),...

Вывести элементы числовой последовательности и их количество
The input contains a sequence of positive integers not exceeding 1000. The sequence ends with...

Замена членов последовательности по определенной формуле
Даны действительные числа a1,..., a50. Получить "сглаженные" значения a1,..., a50, заменив в...

36
DemolitionMan
130 / 156 / 87
Регистрация: 06.04.2016
Сообщений: 992
22.09.2016, 08:27 2
Не понял задачу, что должно вывести программа? Просто квадрат числа? Или квадраты от 1 до квадрата введенного числа?
0
BlackRock
1 / 1 / 0
Регистрация: 13.02.2015
Сообщений: 30
22.09.2016, 08:32  [ТС] 3
Нет, к примеру пользователь вводит 5, а программа выводит из последовательности 1491625, цифру 6. Вроде ясно пояснил.
0
DemolitionMan
130 / 156 / 87
Регистрация: 06.04.2016
Сообщений: 992
22.09.2016, 10:11 4
А AnsiString можно использовать? Типа в Билдере пишу(C++Builder 6), нормальная будет тема?
0
22.09.2016, 10:11
Invader0x7F
Helper C/C++
282 / 159 / 122
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
22.09.2016, 10:24 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdlib>
#include <clocale>
#include <iostream>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    std::setlocale(LC_ALL, "ru-RU");
    
    // Задаем seed-значение генератора случайных чисел
    std::srand((unsigned)std::time(NULL));
 
    // Инициализируем массив разрядов числа
    vector<unsigned int> n_digits;
    // Задаем начальные значения переменным sum = 0 и count = 2 * 10^6
    unsigned int sum = 0; int count = 2000000;
 
    // В цикле выполняем count - итераций. При каждой итерации генерируем случайное
    // число, возводим его в квадрат и прибавляем к значению переменной sum для того
    // чтобы получить в результирующее число sum, состоящее из группы разрядов, и 
    // представляющее собой сумму квадратов натуральных чисел.
    while (--count >= 0)
    {
        // Генерируем случайное число n_val e [0..9]
        unsigned int n_val = std::rand() % 10;
        // Возводим его в квадрат и прибавляем к значению переменной sum
        sum += unsigned int(std::pow((double)n_val, 2));
    }
 
    // Выводим результирующее значение sum на экран
    std::cout << sum << endl;
 
    // Присваиваем результирующее значение sum переменной n_val
    unsigned int n_val = sum;
    // В цикле делим значение переменной n_val на 10 до тех пор
    // пока переменная n_val не примет значение равное 1
    for (; n_val > 1; n_val /= 10)
        // Для каждого значения n_val выполняем вычисление остатка от деления на 10
        // и записываем полученный результат в массив n_digits.
        n_digits.push_back(n_val % 10);
 
    unsigned int k = 0;
    // Вводим с клавиатуры индекс разряда значение которого мы хотим получить
    std::cout << "Введите число k = "; std::cin >> k;
 
    // Выполняем проверку находится ли значение переменной k в диапазоне от 0 до n_digits.size()
    if (k >= 0 && k <= n_digits.size() - 1)
        // Вычисляем значение индекса разряда находящегося в позиции k с учетом того,
        // что полученные значения всех разрядов числа sum записаны в массив в обратном
        // порядке (т.е. n_digits.size() - k - 1). Выводим значение разрядка k на экран.
        std::cout << "val = " << sum << " sum[" << k << "] = " \
            << n_digits.at(n_digits.size() - k - 1) << endl;
 
    std::cin.get();
    std::cin.get();
 
    return 0;
}
Проверяйте!
0
Миниатюры
Вывод определенной цифры в числовой последовательности  
SpBerkut
Объявлятель переменных
949 / 275 / 276
Регистрация: 24.09.2011
Сообщений: 1,009
Завершенные тесты: 2
22.09.2016, 10:41 6
Invader0x7F, вы не поняли. ТС хочет получить k-ю цифру не какого-то произвольного числа, а ряда, состоящего из записанных подряд квадратов натуральных чисел (1 4 9 16 25 36 49 64 81 100 121 и т.д.). Например, для k=2800 нужно получить значение 9.
P.s. Как вы первый пост читали — ума не приложу.
1
Invader0x7F
Helper C/C++
282 / 159 / 122
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
22.09.2016, 10:49 7
Задание я прочитал правильно:

программа выводит k-ую цифру(именно цифру), из последовательности квадратов натуральных чисел вида 1491625
Если речь идет о получении k-той цифры, то в большинстве случаев мы имеет дело с k-тым разрядом числа. Например, число 123456 k=3 разряд имеет значение 4.

Что касается самой постановки задачи, то тут очень много неоднозначностей (т.е. данную задачу можно понимать по разному).
0
Apostol584
244 / 150 / 118
Регистрация: 26.11.2012
Сообщений: 376
Завершенные тесты: 2
22.09.2016, 10:49 8
Лучший ответ Сообщение было отмечено BlackRock как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
 
int main() {
    int k = 2800;
    std::string s;
    for(int i = 1; s.size() < k; i++) s += std::to_string(i*i); //возводим число в квадрат и прибовляем к строке до тех пор пока она не будет нужной длины
    std::cout << s[k - 1]; // выводим нужную цифру тк нумерация начинается с 0, к-1
    return 0;
}
3
Invader0x7F
Helper C/C++
282 / 159 / 122
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
22.09.2016, 10:50 9
и так тоже можно. но я специально не прибегал к использованию строк, так как это выходит за рамки поставленной задачи.
0
Байт
Эксперт C
20977 / 13234 / 2789
Регистрация: 24.12.2010
Сообщений: 27,857
22.09.2016, 11:03 10
C++
1
2
3
4
5
6
7
8
9
10
11
for(i=1, kc=0; kc < K; i++) {
   iii = ii = i*i;
   for(ki=0; ii; ii /= 10) ki++;
   kc += ki;
}
n = kc - K;
for(j=0; j<=n; j++) {
   c = iii%10;
   iii /= 10;
}
cout << c;
Псевдокод
3
DemolitionMan
130 / 156 / 87
Регистрация: 06.04.2016
Сообщений: 992
22.09.2016, 11:11 11
Ух, сделал!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#include <conio.h>
#include <iostream.h>
#define Razmer 1024
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int df, s, d, vr, sign, rs/*razmer stroki*/, Number;
char str[40], BS[Razmer]/*BS - bolshaya stroka*/;
 
int main(int argc, char* argv[])
{
do{
    cout << "Vvedite chislo ot 1 do " << Razmer << ":\n";
    cin >> Number;
if((Number < 1)&&(Number > Razmer)){
  cout << "Neverno vvedeno chislo. Davai eshe!\n";
  }
}
while((Number < 1)&&(Number > Razmer));
Number--;
s = 1;//Vozvoditsya v stepen
rs = 0;
while(rs < Number){
    //vr - vremenno
    vr = d = pow(s, 2);
    sign = 0;
    while(vr){
    vr %= 10;
    vr /= 10;
    sign++;
    }
    if(sign < 39){
      itoa(d, str, 10);
      strcat(BS, str);
      }
    else{
      char *newstr = new char[sign+1];
      itoa(d, newstr, 10);
      strcat(BS, newstr);
      }
    rs += sign;
    s++;//Pribavlyaem chislo vozvodimoe v stepen;
}
cout << "Poluchennii symbol: " << BS[Number] << "\n";
 
 
getch();
return 0;
}
//---------------------------------------------------------------------------
0
sourcerer
Модератор
Эксперт CЭксперт С++
4934 / 2120 / 326
Регистрация: 20.02.2013
Сообщений: 5,577
Записей в блоге: 24
Завершенные тесты: 1
22.09.2016, 11:20 12
DemolitionMan, почитайте что-нибудь про coding convention. Куча ничего не значащих однобуквенных имён переменных и транслит - это дикость и колхоз.
0
DemolitionMan
130 / 156 / 87
Регистрация: 06.04.2016
Сообщений: 992
22.09.2016, 11:33 13
Цитата Сообщение от Apostol584 Посмотреть сообщение
std::to_string(i*i);
- Apostol, функция to_string - самопальная какая-то, у меня в C++Builder 6 не видит.
Цитата Сообщение от gru74ik Посмотреть сообщение
DemolitionMan, почитайте что-нибудь про coding convention. Куча ничего не значащих однобуквенных имён переменных и транслит - это дикость и колхоз.
- слышь, модератор, ты запарил уже нарываться на меня, веди себя посдержаннее. По-моему очень разумным будет вообще больше не приходить на Ваш Форум. Почему? Да потому, что посмотри:
1) я сделал работу, причем не самую легкую, трудную;
2) программа работает, все в порядке, но вместо благодарности(спасибо и лучший ответ) я получаю упреки;
3) я читал соглашения кода;
4) посмотри программу лучше, там есть описание переменных;
0
Apostol584
244 / 150 / 118
Регистрация: 26.11.2012
Сообщений: 376
Завершенные тесты: 2
22.09.2016, 11:39 14
Цитата Сообщение от DemolitionMan Посмотреть сообщение
- Apostol, функция to_string - самопальная какая-то, у меня в C++Builder 6 не видит
она является в строенной функцией С++ начиная с C++11.

http://en.cppreference.com/w/cpp/string/basic_string/to_string
Цитата Сообщение от DemolitionMan Посмотреть сообщение
но Ваш вонючий форум не поддерживает русские буквы
у меня все прекрасно работает
0
sourcerer
Модератор
Эксперт CЭксперт С++
4934 / 2120 / 326
Регистрация: 20.02.2013
Сообщений: 5,577
Записей в блоге: 24
Завершенные тесты: 1
22.09.2016, 11:52 15
DemolitionMan, зря Вы так. Я просто покритиковал код. То, что Вы помогаете новичкам, это прекрасно, Вы молодец. А вот критику учитесь спокойно воспринимать. Ничего такого страшного не случилось. И форум у нас прекрасный, а вовсе не "вонючий". Так что, неправда Ваша. И тон Вы взяли неверный. Нехорошо в таком ключе с людьми общаться (вне зависимости от того, модератор это или обычный пользователь).
Возможно, я выбрал слишком резкие эпитеты для оценки Вашего кода (что Вас и задело), за это прошу прощения. Могу выразиться помягче:
DemolitionMan, почитайте что-нибудь про coding conventions. Куча ничего не значащих однобуквенных имён переменных и транслит - это крайне непрофессионально, так пишут только совсем зелёные новички, а Вы же уже не первый день на плюсах пишете?
4
SpBerkut
Объявлятель переменных
949 / 275 / 276
Регистрация: 24.09.2011
Сообщений: 1,009
Завершенные тесты: 2
22.09.2016, 11:54 16
Работает, почему-то, с перебоями. Строки не используются. Должен работать быстро, т.к. операций минимум.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
using namespace std;
unsigned sa(unsigned *a, unsigned k){
    unsigned r=0;
    for(unsigned i=0;i<k;r+=a[i++]);
    return r;
}
unsigned foo(unsigned k){
    unsigned n[17]={0,3,6,22,68,217,683,2163,6837,21623,68377,216228,683772,2162278,6837722,21622777,68377223};
    unsigned y, x = 0, t, s = 0, i;
    while (s<k){
        x+=n[i];
        s+=n[i]*i;
        i++;
    }
    if (s==k) {x=sa(n,i); return (x*x)%10;} //костыль
    if (s>k){
        i--;
        x-=n[i];
        s-=n[i]*i;
    }
    y=x+1+(k-1-s)/i; //число, в квадрате которого находится искомая цифра
    t=s+(y-x)*i;
    y*=y;
    while (t-->k) y/=10;
    return y%10;
}
 
int main()
{
        std::cout << foo(5500);
}
0
Croessmah
++Ͻ
15731 / 8882 / 1702
Регистрация: 27.09.2012
Сообщений: 21,847
Записей в блоге: 2
Завершенные тесты: 2
22.09.2016, 11:56 17
Цитата Сообщение от DemolitionMan Посмотреть сообщение
функция to_string - самопальная какая-то
Это стандартная штуковина.
Цитата Сообщение от DemolitionMan Посмотреть сообщение
у меня в C++Builder 6 не видит
Не удивительно.
Цитата Сообщение от DemolitionMan Посмотреть сообщение
По-моему очень разумным будет вообще больше не приходить на Ваш Форум.
Никого не держим или Вы мазохист? Не хочу заходить, но буду.
Цитата Сообщение от DemolitionMan Посмотреть сообщение
программа работает, все в порядке, но вместо благодарности(спасибо и лучший ответ) я получаю упреки;
Ну и самомнение.
Неадекватная реакция на критику. Вас пнули за ужасный код.
Вместо того чтобы сделать выводы Вы начинаете выдавать каку за конфету.
Цитата Сообщение от DemolitionMan Посмотреть сообщение
если бы ты был чуть более проницательным и знал историю
Я смотрю Вы - историческая личность.
И да, форум нормально всё поддерживает, просто у кого-то руки кривые с кодировками проблема.
0
SpBerkut
Объявлятель переменных
949 / 275 / 276
Регистрация: 24.09.2011
Сообщений: 1,009
Завершенные тесты: 2
22.09.2016, 12:05 18
Перешаманил. Стало веселее.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
unsigned foo(unsigned k){
    unsigned n[17]={0,3,6,22,68,217,683,2163,6837,21623,68377,216228,683772,2162278,6837722,21622777,68377223};
    unsigned y, x = 0, s = 0, i=0;
    for(;s<k;x+=n[i],s+=n[i]*i++);
    x-=n[--i];
    s-=n[i]*i;
    y=x+1+(k-1-s)/i;
    s+=(y-x)*i;
    y*=y;
    while (s-->k) y/=10;
    return y%10;
}
 
int main()
{
    for(int i = 1; i<20;cout << foo(i++));   
}
0
Invader0x7F
Helper C/C++
282 / 159 / 122
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
22.09.2016, 12:58 19
Может быть это имел ввиду ТС ?! :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdlib>
#include <clocale>
#include <iostream>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    std::vector<unsigned int> n_digits;
    std::vector<unsigned int> n_digits_cnts;
    std::vector<unsigned int> n_vals = { 10, 131, 561, 788423, 4359 };
 
    unsigned int k = 10;
 
    std::vector<unsigned int>::iterator pn_val;
    for (pn_val = n_vals.begin(); pn_val != n_vals.end(); pn_val++)
    {
        unsigned int count = 0;
        unsigned int curr_val = *pn_val;
        for ( ;curr_val >= 1; curr_val /= 10) 
             ++count;
 
        n_digits_cnts.push_back(count);
    }
 
    unsigned int pos = 0, sum = 0;
    pn_val = n_digits_cnts.begin();
    while (pn_val != n_digits_cnts.end() && sum < k)
    {
        sum += *pn_val++; pos++;
    }
 
    pos = (pos == 0) ? pos + 1 : pos;
 
    unsigned int n_val = n_vals[pos - 1];
    unsigned int rel_pos = n_digits_cnts[pos - 1] - \
        unsigned int(std::abs(double(sum - k)));
 
    for (; n_val >= 1; n_val /= 10)
        n_digits.push_back(n_val % 10);
    
    std::cout << "n_vals[" << pos - 1 << "] = "<< n_vals[pos - 1] << " k = " << k \
        << " digit = " << n_digits.at((n_digits.size() != rel_pos) ? \
        (n_digits.size() - rel_pos - 1) : (n_digits.size() - 1)) << endl;
    
    std::cin.get();
    std::cin.get();
 
    return 0;
}
Пробуйте!
0
Миниатюры
Вывод определенной цифры в числовой последовательности  
BlackRock
1 / 1 / 0
Регистрация: 13.02.2015
Сообщений: 30
22.09.2016, 13:56  [ТС] 20
Спасибо всем, буду тестить.
0
22.09.2016, 13:56
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2016, 13:56

Проблемы с переименовыванием и копированием файлов в определенной последовательности
Здраствуйте. И с ходу): Есть папка &quot;in&quot;, в ней есть текстовый файл (1.txt), в нем ряд цифер (без...

Значение минимального положительного члена числовой последовательности заданной соотношением
Используя оператор цикла, составить программу, в которой находится значение минимального...

Найти n-й член числовой последовательности, которая определяется рекуррентной формулой
Найти n-й член числовой последовательности, которая определяется рекуррентной формулой: a1 = 1, ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru