Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 36
1

Перебор массива в цикле; не выводится нужный результат

25.09.2022, 18:18. Показов 1383. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Вероятно, вопрос и код содержат в себе базовые вещи, которых я не понимаю в силу недавнего знакомства с языком, но требуется помощь. Задача программы - вывод числа, обладающего следующими свойствами: число заканчивается на 2, при переставлении этой цифры в начало получается число в два раза больше. Следовательно, требуется последовательно работать со степенями двойки: 2, 4, 8 просто выводятся как часть нужного нам числа, т.к. они меньше 10, а все следующие степени делятся с остатком на 10, остаток программа выводит как часть соответствующего числа, а результат целочисленного деления на 10 запоминается в переменной и прибавляется к следующей степени двойки, с которой дальше и производится работа. Механику выполнения программы понимаю, но написать не выходит. Ограничение, которое остановит выполнение программы на нужных нам 18 цифрах ответа и не уйдет в бесконечность, пока вообще не уверена, как написать. Требуемый ответ: 248 637 498 751 362 501.

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
#include <stdio.h>
#include <locale.h>
#define iSizeAr 50
int main() {
    unsigned int arr[32];
    unsigned int num = 30;
    const unsigned int a0 = 1;
    for (int i = 1; i <= num; i++) {
        arr[i] = a0 << i;
        setlocale(LC_CTYPE, "Russian");
        for (int y = 1; arr[i] < 10; y++, arr[i] *= 2) {
            printf("%d", arr[i]);
        }
        for (int i = 1; i < 30; i++) {
            for (int y = 1; arr[i] > 10; y++) {
                int n;
                n = arr[i] % 10;
                int cl;
                cl = arr[i] / 10;
                arr[i] = arr[i + 1] + cl;
                printf("%d", n);
            }
        }
    }
    return 0;
}
Вывод пока получался какой угодно, но только не тот, который требуется. Объясните, пожалуйста, где мои ошибки и каким образом можно эту гадость починить. Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2022, 18:18
Ответы с готовыми решениями:

Перебор элементов массива в цикле
Знаю,вопрос тупой, но что делать,не знаю.:wall: (Код на java в Android studio)У меня есть...

Перебор элементов массива в цикле for
есть 3 массива с равным кол-вом элементов, необходимо, чтобы они одновременно изменялись и внутри...

Перебор экземпляров массива в цикле
Какой вариант быстрее? Есть ли вообще разница и насколько большая? Зависит ли от типа объекта в...

Не вызывается нужный элемент массива по значению управляющей переменной в цикле for
Вот часть кода : for(int i=0; i &lt; 5; i++){ cout &lt;&lt; &quot;Этот объект &quot; &lt;&lt; shapes-&gt;getName() &lt;&lt;...

19
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
25.09.2022, 18:28 2
обьясните назначение этой строки
#define iSizeAr 50
0
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 36
25.09.2022, 18:31  [ТС] 3
Простите, строка явно лишняя. Не заметила и не убрала при редактировании и отправке на форум.
0
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
25.09.2022, 18:34 4
Цитата Сообщение от tusqk Посмотреть сообщение
Простите, строка явно лишняя. Не заметила и не убрала при редактировании и отправке на форум.
это зачем ?

setlocale(LC_CTYPE, "Russian");
0
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 36
25.09.2022, 18:39  [ТС] 5
На данный момент назначения не имеет, впоследствии - для добавления строчек формата "ответ"/"искомое число". Работу скидывать преподавателю, хотелось бы, чтобы выглядело соответствующе.
0
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
25.09.2022, 18:40 6
задание еапишите, а ваши мысли в виде камментов к коду напишите
и запакуйте исходник в CODE
а то- нечитабельно
0
687 / 444 / 209
Регистрация: 18.10.2020
Сообщений: 1,606
25.09.2022, 18:51 7
SergP01, в этом куске смысл отсутствует...
А вообще девушка такой фигни тут понаписала, мдя.
Цитата Сообщение от tusqk Посмотреть сообщение
248 637 498 751 362 501
как можно получить такие ответы, если число должно оканчиваться на 2?
0
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
25.09.2022, 18:58 8
Цитата Сообщение от programmer_08 Посмотреть сообщение
А вообще девушка такой фигни тут понаписала, мдя.
дык... я так и не понял чего она хочет..
задание написано так, что его нужно пытаться понять....
если она ТЗ правильно напишет, то она и код сама напишет
0
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 36
25.09.2022, 18:59  [ТС] 9
Оно выводится в данном случае с конца. Фактически ответ, конечно же, 105 263 157 894 736 842. Про решение соответствующей задачи можно почитать в интернете. Цель создания темы - узнать, как исправить код, а не получить констатацию факта о том, что он работает неверно.
0
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
25.09.2022, 19:00 10
вопрос ТСу ... что это делает
for (int i = 1; i <= num; i++) {
arr[i] = a0 << i;
0
687 / 444 / 209
Регистрация: 18.10.2020
Сообщений: 1,606
25.09.2022, 19:01 11
tusqk,
Цитата Сообщение от tusqk Посмотреть сообщение
105 263 157 894 736 842
хорошо, где здесь числа оканчивающиеся на 2? (кроме последнего)
0
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 36
25.09.2022, 19:08  [ТС] 12
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
#include <stdio.h>
#include <locale.h>
int main() {
    unsigned int arr[32];
    unsigned int num = 30;
    const unsigned int a0 = 1;
    for (int i = 1; i <= num; i++) {
        arr[i] = a0 << i;
        setlocale(LC_CTYPE, "Russian");
        for (int y = 1; arr[i] < 10; y++, arr[i] *= 2) {
            printf("%d", arr[i]);
        }
        for (int i = 1; i < 30; i++) {
            for (int y = 1; arr[i] > 10; y++) {
                int n;
                n = arr[i] % 10;
                int cl;
                cl = arr[i] / 10;
                arr[i] = arr[i + 1] + cl;
                printf("%d", n);
            }
        }
    }
    return 0;
}
Задание: написать программу, которая ищет целое число, обладающее следующим свойством: число заканчивается на 2, и если эту цифру переставить в начало, то получится число в 2 раза больше: x...yz2 * 2 = 2x...yz
0
101 / 95 / 10
Регистрация: 31.08.2022
Сообщений: 1,014
25.09.2022, 19:10 13
Цитата Сообщение от tusqk Посмотреть сообщение
число заканчивается на 2, и если эту цифру переставить в начало
куда в начало... с заменой первой цифры ?
или 132.... 213
0
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 36
25.09.2022, 19:10  [ТС] 14
Это одно число. Даже в теме указано, что нужный результат имеет 18 знаков.
0
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 36
25.09.2022, 19:16  [ТС] 15
Без замены первой цифры. Просто переставляется. «Заменяется» я не писала.

Добавлено через 5 минут
Сдвиг влево на i разрядов. Будет иметь тот же смысл, что и умножение на 2 i раз. Если массив следует создать иначе или в этом заключается проблема - скажите об этом, пожалуйста.
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
25.09.2022, 22:27 16
Лучший ответ Сообщение было отмечено tusqk как решение

Решение

Цитата Сообщение от tusqk Посмотреть сообщение
Про решение соответствующей задачи можно почитать в интернете.
Относительно недавно мы уже решали аналогичную задачу здесь. Искомое число можно "соткать" от младших цифр к старшим 2, 4, 8, 6 (перенос 1), 3 и т.д. пока не встретим 1 без переноса. Именно это, по идее, и должна делать ваша программа. Но что вы там такое творите в своем коде - навскидку не ясно. И зачем вам понадобились степени двойки?

---

А "в лоб" я бы решал эту задачу так:

По условию мы ищем числа, a, для которых выполняется

https://www.cyberforum.ru/cgi-bin/latex.cgi?2 \cdot (10a + 2) = 2 \cdot {10}^{\lceil \log_{10} a \rceil} + a

Будем делать перебор по количеству цифр в a, то есть по https://www.cyberforum.ru/cgi-bin/latex.cgi?d = \lceil \log_{10} a \rceil

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
2 \cdot (10a + 2) = 2 \cdot {10}^{d} + a<br />
19a = 2 \cdot {10}^{d} - 4<br />

То есть нас интересуют числа вида https://www.cyberforum.ru/cgi-bin/latex.cgi?2 \cdot {10}^{d} - 4, которые делятся на 19. Попробуем поискать такие числа в диапазоне unsigned long long

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <limits>
#include <iostream>
 
int main()
{
  unsigned long long p210n = 20;
  do
  {
    if ((p210n - 4) % 19 == 0)
      std::cout << (p210n - 4) / 19 << std::endl;
      
    if (p210n > std::numeric_limits<unsigned long long>::max() / 10)
      break;
      
    p210n *= 10;
  } while (true);
}
Нам повезло: нашлось 10526315789473684. Ответ задачи: 105263157894736842.

---

А если поискать подальше

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
 
using boost::multiprecision::cpp_int;
 
int main()
{
  cpp_int p210n = 20;
  for (unsigned n = 100; n > 0; --n, p210n *= 10)
    if ((p210n - 4) % 19 == 0)
      std::cout << (p210n - 4) / 19 << std::endl;
}
то найдутся

Код
10526315789473684
10526315789473684210526315789473684
10526315789473684210526315789473684210526315789473684
10526315789473684210526315789473684210526315789473684210526315789473684
10526315789473684210526315789473684210526315789473684210526315789473684210526315789473684
Ну здесь все ожидаемо.
0
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 36
25.09.2022, 22:58  [ТС] 17
По степеням двойки - достаточно логичное решение. Т.к. известна последняя цифра числа - 2, переставив ее, число удвоили, значит, предпоследняя цифра 4 (2*2), перед ней 8 (4*2), 6 (8*2), 3 (6*2 + 1 от умножения 8*2) и т.д.

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
#include <stdio.h>
#include <math.h>
#include <locale.h>
#define massiv 60
int main(void)
{
    int a[massiv]; // цикл умножения на 2; при добавлении printf("%d\n",a[i]) выводится соответствующий результат
    a[0] = 1;
    for (int i = 1; i < massiv + 1; i++) {
        a[i] = a[i - 1] * 2;
 
        int m = 0, s = 1, b = 0, i, k = 0, q = 0;
        /*for (i = massiv; i > 0; i--) {  // выводится нужное число в обратном порядке и кол-во его цифр
            a[i] = m + 2 * s;
            m = a[i] / 10;
            s = a[i] % 10;
 
            if (s == 2 && m == 0)
                k++;
 
            if (k == 2) // прерывание цикла, чтобы он не ушел в бсконечность
                break;
            printf("%d ", s); q++;
        }
        printf("%d ", q);*/
 
        int a[massiv]; 
        for (i = massiv - 1; i > 0; i--) {
            a[i] = m + 2 * s;
            m = a[i] / 10;
            s = a[i] % 10;
            a[i] = s;
 
            if (s == 2 && m == 0) 
                k++;
            if (k == 2) // ограничения для цикла, в котором цифры искомого числа выводятся уже в верном порядке
                break;
        }
 
        for (i = massiv - q; i < massiv; i++)
            printf("%d ", a[i]); // вывод цифр в верном порядке
        return 0;
    }
}
Спасибо за помощь, все решилось.
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
25.09.2022, 23:36 18
Цитата Сообщение от tusqk Посмотреть сообщение
По степеням двойки - достаточно логичное решение. Т.к. известна последняя цифра числа - 2, переставив ее, число удвоили, значит, предпоследняя цифра 4 (2*2), перед ней 8 (4*2), 6 (8*2), 3 (6*2 + 1 от умножения 8*2) и т.д.
3? 6? Это степени двойки?

Цитата Сообщение от tusqk Посмотреть сообщение
C
1
2
for (int i = 1; i < massiv + 1; i++) {
   a[i] = a[i - 1] * 2;
Ничего не понимаю. Что это за цикл в цикле? В чем смысл внешнего цикла? Где в коде используются эти "степени двойки"? Первая же итерация внешнего цикла заканчивается return 0;. Зачем он нужен тогда?

Переменная q всегда равна 0, то есть программа ничего не выводит.

Цитата Сообщение от tusqk Посмотреть сообщение
Спасибо за помощь, все решилось.
Вы что-то выдумываете.
0
0 / 0 / 0
Регистрация: 25.09.2022
Сообщений: 36
25.09.2022, 23:48  [ТС] 19
Вы не читаете то, что я пишу. 3 и 6 - части выводимого ответа, а не степени двойки. А получаются они как раз посредством работы со степенями. Попробуйте решить это вручную и самостоятельно понять принцип умножения на 2 в данном случае, если не очевидно, почему это происходит. Задача не новая, можете ее погуглить и почитать иные рассуждения на ее счет.
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
26.09.2022, 02:21 20
Цитата Сообщение от tusqk Посмотреть сообщение
3 и 6 - части выводимого ответа, а не степени двойки. А получаются они как раз посредством работы со степенями. Попробуйте решить это вручную и самостоятельно понять принцип умножения на 2 в данном случае, если не очевидно, почему это происходит.
Я уже детально описал "принцип умножения на 2 в данном случае" выше. Он же - "принцип" сложения числа с самим собой. И я по прежнему в упор не вижу, при чем здесь "степени двойки".

И еще раз: в вашем изначальном коде за "степени двойки" отвечало некое arr[i] = a0 << i; и это еще вроде как-то участвовало в вычислениях (если мне не показалось).

В вашем новом коде от "степеней двойки" осталось только некое a[i] = a[i - 1] * 2;, которое никому не нужно и в вычислениях никак не участвует, т.е. является мертвым кодом внутри никому не нужного внешнего цикла. Потому и возникает вопрос: зачем здесь все это?
0
26.09.2022, 02:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2022, 02:21
Помогаю со студенческими работами здесь

Два массива, перебор значений по условию в цикле
Доброго времени суток друзья! с vba на Python перейти оказалось немного сложнее чем думал (много...

Выводится результат, не дождавшись завершения работы массива
Здраствуте! Программа работает правильно, но выводит 2 раза (Если ввести кол-во векторов 2 и...

Результат выводится в поле но не выводится в span
&lt;div class=&quot;hot_predlojenia&quot;&gt; &lt;input type=&quot;checkbox&quot; name=&quot;hot_home_page&quot;...

Почему itog не выводится (нужный код в незаккоментированной части)
#include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; int main() { char...

Перебор в цикле while
Здравствуйте, уважаемые помощники! При выводе в файл из цикла while программа каждый раз...

Перебор в цикле
Есть такой код Form2.ADOQuery1.SQL.Text:='select * from 7DTD where STEAM='+QuotedStr(STEAMID); ...

Не выходит нужный результат примера
Люди помогите плииз! Не выходит пример (числа в двоичной системе исчисления) 010 or(101 or 010)....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru