Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157

Сложить все цифры числа, умножая каждую цифру на ее порядковый номер

21.09.2017, 01:19. Показов 3522. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. дан ряд чисел через пробел. нужно сложить все цифры числа, умножая каждую цифру на ее порядковый номер, т.е. 23 это 2*1 + 3*2 = 8. но почему то ответ выдает нули. в чем моя ошибка?

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;
 
 
int data[34];
int ans[34];
int a,b,c,x,y;
int num;
int size[34];
 
int main()
{
    for(int i = 0; i < 34; i++) cin>>data[i];
    
    for( x = 0, y = 0; x < 34, y < 34; x++, y++){
        while(data[x]){
            data[x] % 10;
            data[x] /= 10;
            size[y]++;  
        }
    }
    
    for(a = 0, b = 0, c = 0; a < 34, b < 34, c < 34; a++, b++, c++){
        while(data[a]){
            num = data[a] % 10;
            ans[b] += num * (size[c]--);
            data[a] /= 10; 
        }
    }
    
    for(int j = 0; j < 34; j++) cout<<ans[j]<<" ";
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.09.2017, 01:19
Ответы с готовыми решениями:

Сосчитать сумму цифр,умножая каждую цифру на её порядковый номер (позицию) в числе
Например : 154 = 1*1 + 5*2 + 4*3 Я решила, но получился совершенный быдло код . я создаю 2 экземпляра переменных класса Chislo. С...

Разделить каждую цифру числа на ее порядковый номер
Уважаемые, подскажите, пожалуйста. Плюсы только начал изучать, всё с нуля. Суть задачи: Дано число. Разделить каждую цифру числа на его...

Разделить каждую цифру числа на его порядковый номер
Дано число. Разделить каждую цифру числа на его порядковый номер. Полученное число напечатать.

14
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
21.09.2017, 03:57
Да всё ошибка...
0
1617 / 1182 / 553
Регистрация: 08.01.2012
Сообщений: 4,560
21.09.2017, 06:34
Цитата Сообщение от Kamila11 Посмотреть сообщение
выдает нули
так программа работает?
0
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
21.09.2017, 08:55  [ТС]
oldnewyear, подскажите пожалуйста, в чем именно?
0
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
21.09.2017, 08:56
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
#include <iostream>
#include <iterator>
#include <string>
#include <sstream>
#include <algorithm>
 
class digit_iterator {
public:
    digit_iterator(size_t number) :_number(number), _dec(1)
    {
        while(number /= 10) _dec *= 10;
        ++(*this);
    }
    digit_iterator():_number(0), _dec(0), _digit(0) {}
    digit_iterator& operator++() {
        _digit = _dec == 0 ? 0 : _number / _dec;
        _number -= _dec * _digit;
        _dec /= 10;
        return  *this; }
    unsigned operator*() const
        { return _digit; }
    bool operator!=(const digit_iterator &other) const
        { return _number != other._number || _digit != other._digit || _dec != other._dec; }
private:
    size_t _number;
    size_t _dec;
    unsigned _digit;
};
 
int main()
{
    std::string str;
    std::getline(std::cin,str);
    std::istringstream ss(str);
    std::istream_iterator<size_t> its(ss), eos;
    std::vector<size_t> numbers(its, eos);
    std::transform(numbers.begin(), numbers.end(),
                   std::ostream_iterator<size_t>(std::cout, " "),
                   [](size_t n){
                        size_t index(1);
                        return std::accumulate(digit_iterator(n), digit_iterator(), 0, 
                                [&index](unsigned last, unsigned x) { return last + (index++) * x; });});
}
1
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
21.09.2017, 09:06  [ТС]
MansMI, ну как сказать. некорректно.

Добавлено через 8 минут
woldemas, мне знаний не хватает, чтобы понять что вы тут написали. да и мне главное не сделать, а научиться самой. поэтому не нужно решать задачу за меня. но спасибо, что потрудились.
0
 Аватар для dopleref
42 / 52 / 33
Регистрация: 15.12.2015
Сообщений: 199
21.09.2017, 09:19
Kamila11, дайте пожалуйста пояснения к тому что вы делаете в коде,
циклы получились достаточно запутанными и без объяснения алгоритма сложно разобраться
в чем может быть ошибка.
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
21.09.2017, 09:34
Лучший ответ Сообщение было отмечено Kamila11 как решение

Решение

Цитата Сообщение от Kamila11 Посмотреть сообщение
почему то ответ выдает нули
Ничего удивительного. Цикл while в 16 строке завершится тогда, когда data[i] станет равно нулю. Вот этот нуль программа и выдаёт. То есть, при определении длины числа вы меняете само это число, делая его в конечном итоге равным нулю. Чтобы число не менялось, создайте вспомогательную переменную, присвойте ей значение data[i], и в цикле меняйте эту вспомогательную переменную (её не жалко). А data[i] сохранится в своём первозданном виде.

Впрочем, в программе есть и другие неточности. Например, 17 строка ничего не делает, её можно смело удалить.

Далее, в цикле for в 34 строке используются три переменные a, b, c, которые на каждом шаге цикла имеют одно и то же значение. Зачем три переменных? Достаточно лишь одной (обычно её в таких случаях называют i - счётчик цикла). То же относится к 15 строке: две переменные x и y не нужны. Такое ощущение, что вы боитесь использовать в разных циклах переменную с одним и тем же именем - как бы чего не вышло. Но проблема может быть только если циклы вложены один в другой.

Ну и наконец, число 34 лучше сделать именованной константой (например n), или даже переменной, чтобы её значение можно было вводить с клавиатуры. Тогда вы сможете легко менять это число только в одном месте программы. Лично мне было бы влом вводить даже 17 чисел, не говоря уж о 34. Но для проверки логики работы программы хватило бы и трёх чисел. А потом, когда программа будет выдавать верный результат, можно сделать n равным любому нужном числу.
1
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
21.09.2017, 09:45
Лучший ответ Сообщение было отмечено Kamila11 как решение

Решение

Цитата Сообщение от Kamila11 Посмотреть сообщение
да и мне главное не сделать, а научиться самой
Очень похвально, я постарался убрать ошибки из вашего кода и прокомментировать, что по моему мнению неверно.
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
#include <iostream>
using namespace std;
 
 
int data[34];
int ans[34];
int a,b,c,x,y;
int num;
int size[34];
 
int main()
{
   size_t n = 4; // 34 - что-то много для проверки!
 
   for(int i = 0; i < n; i++) cin >> data[i];
 
   for(x = 0; x < n; x++){ // Зачем тут были "y" ?!
        // Нельзя изменять data[x]
        int tmp = data[x];
        while(tmp){
            //data[x] % 10; -- Это что вообще?!
            tmp /= 10;
            size[x]++;
        }
    }
 
    for(a = 0; a < n; a++){ // Зачем b и с ?!
        ans[a] = 0; // Обнулить на всякий случай       
        int tmp = data[a]; // Не надо изменять data!
        while(tmp){
            num = tmp % 10;
            tmp /= 10;
            ans[a] += num * (size[a]--); // Ну можно и так.
        }
    }
 
    for(int j = 0; j < n; j++) cout<<ans[j]<<" ";
}
1
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
21.09.2017, 09:50  [ТС]
dopleref,
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
int main()
{
    for(int i = 0; i < 34; i++) cin>>data[i];
    
    /*
     с 18 по 24 строку выполняется измерение длины числа(по крайней мере так задумано).
      я подумала что можно измерить длину
     а потом умножать цифры числа, начиая с последней, каждый раз уменьшая число длины
     */
    for( x = 0, y = 0; x < 34, y < 34; x++, y++){ 
        while(data[x]){ //пока число не равно нулю
            data[x] % 10; //это вообще лишнее
            size[y]++;  
            data[x] /= 10;  //по задумке число должно было делиться на 10, чтобы уменьшиться на одну цифру,
              // но теперь мне все кажется бредом
        }
    }
    
    for(a = 0, b = 0, c = 0; a < 34, b < 34, c < 34; a++, b++, c++){
        while(data[a]){
            num = data[a] % 10; //находим последнюю цифра числа
            ans[b] += num * (size[c]--); //тут вроде как умножаются последние цифры на свой порядковый номер и складываются
            data[a] /= 10; //число делится на 10 и теряет последнюю цифру и все повторяется заново
        }
    }
    
    for(int j = 0; j < 34; j++) cout<<ans[j]<<" ";
}
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
21.09.2017, 10:11
Kamila11, есть
C++
1
for(int i = 0; i < 34; i++) cin>>data[i];
как вводите числа через пробел или используя клавишу "enter".
1
 Аватар для dopleref
42 / 52 / 33
Регистрация: 15.12.2015
Сообщений: 199
21.09.2017, 13:12
Kamila11, теперь разобрался с Вашим кодом.

В качестве альтернативы предложным вариантам, можно выделить
код по преобразованию каждого элемента в отдельную функцию.
Мой вариант с использованием stl (если такой вариант сложноват,
то можете использовать код в функторе Calc, перенеся его в отдельную
функцию и вызвав ее для каждого элемента):

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
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <random>
#include <functional>
 
struct Calc {
    void operator()(int& n) const {
        // определяем длину
        int i = 1;
        int tmp = n;
        while (tmp /= 10) {
            i++;
        }
        // считаем результат
        tmp = n;
        int sum = 0;
        while (i--) {
            sum += (tmp % 10) * (i + 1);
            tmp /= 10;
        }
        
        n = sum;
    }
};
 
int main() {
    const int N = 4;
    std::vector<int> v(N);
 
    /* заполнение вектора данными */
 
    // преобразуем вектор
    std::for_each(v.begin(), v.end(), Calc());
 
    // выводим преобразованый вектор
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
    return 0;
}
1
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
21.09.2017, 14:30
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int data[34];
int num=0;
int j=0;
char s[10]="\0";
 
int main()
{
    for(int i = 0; i < 34; i++) cin>>data[i];
     for(int i = 0; i < 34; i++)
     {
    itoa(data[i],s,10);
     while(s[j]!='\0')
      {
       num+=(s[j]-'0')*(j+1);
        j++;
       }
       j=0;
      }
      cout<<num;
1
 Аватар для LazySlacker
93 / 77 / 31
Регистрация: 29.08.2017
Сообщений: 188
21.09.2017, 18:40
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 <iostream>
#include <stack>
 
using namespace std;
 
int sumDigits(int n)
{
    stack<int> digits;
    do
    {
        digits.push(n % 10);
    } while ((n /= 10) != 0);
    int s = 0;
    for (int i = 1; !digits.empty(); ++i)
    {
        s += i * digits.top();
        digits.pop();
    }
    return s;
}
 
int main()
{
    cout << sumDigits(123) << endl;
    return 0;
}
1
8 / 8 / 2
Регистрация: 08.07.2016
Сообщений: 157
22.09.2017, 10:52  [ТС]
Большое всем спасибо, помогли с задачей и дали полезные советы.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.09.2017, 10:52
Помогаю со студенческими работами здесь

Разделить каждую цифру заданного числа на его порядковый номер
Дано число. Разделить каждую цифру числа не его порядковый номер. #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std;...

Дано число. Разделить каждую цифру числа на его порядковый номер
Как записать именно деление каждого числа на порядковые номера. могут быть ведь как, например, 111, так и 18473457645874... #include...

Разделить каждую цифру десятичной записи этого числа на его порядковый номер. Полученное число напечатать
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #include &lt;windows.h&gt; using namespace std; double k, newd, numDig,...

Дано число. Разделить каждую цифру десятичной записи этого числа на его порядковый номер. Полученное число нап
2.Дано число. Разделить каждую цифру десятичной записи этого числа на его порядковый номер. Полученное число напечатать. #include...

Определить порядковый номер его максимальной цифры, считая цифры от начала числа
дано натуральное число N, в котором все цифры различны. Определить порядковый номер его максимальной цифры, считая цифры от начала числа


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru