С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 14.01.2024
Сообщений: 29
1

Запись числа в виде строги и подсчёт символов в нём

14.01.2024, 01:00. Показов 1227. Ответов 21
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <string.h>
 
using namespace std;
 
int main()
{
    int x; // объявлеяем переменную
    cin>>x; // вводим переменную
    string y = to_string(x); //делаем из числа строку
    int s=0; // задаём второй переменной значение 0
    int x0 = x; // задаём третей переменной значение второй
    for(int n=strlen(std y) ; n!=0 ; n--) // переменная n это кол-во чисел в цифре x, пока n не равна 0, уменьшать его на 1
        {
        int c = x % 10; // находим последнее число цифры
        int s = s + pow(c,n); // делаем действие связанное с числом Армстронга
        int x = x / 10; // сокращаем цифру на 1 число
        cout<<s<<" ";
        }
    if (s == x0) // если сумма чисел в степени n равна изначальному числу, то вывести "True"
    {
        cout<<"true";
    }
    else // если нет, то вывести "False"
    {
        cout<<"False";
    }
    
}


В общем, пишу программу по числу Армстронга, чтобы пользователь, вводивший число получал ответ, является ли оно числом Армстронга, запнулся на 15 строке, с подсчётом кол-ва символов в числе, вычитал всё что мог, но не выходит ничего, пишет, что какие-то неполадки с переменной y, поможете? (пояснения я уже от безвыходности писал)
0
Лучшие ответы (1)
Programming
Эксперт
9485 / 562 / 19
Регистрация: 12.04.2006
Сообщений: 11,671
Блог
14.01.2024, 01:00
Ответы с готовыми решениями:

Даны 5 строк, подсчет символов в виде функции
Даны 5 строк, подсчитать кол-во символов в каждой. Подсчет слов сформировать в виде функции....

Подсчет числа символов указанного типа в любой строке символов на SHELL
Здравствуйте)) :) Помогите, пожалуйста , разработать программу подсчета числа символов указанного...

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

Подсчет числа неповторяющихся символов
Здравствуйте, есть строка типа AnsiString. Необходимо подсчитать в ней число неповторяющихся...

21
Злостный нарушитель
9618 / 5208 / 1190
Регистрация: 12.03.2015
Сообщений: 24,607
14.01.2024, 02:15 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
#include <iostream>
#include <cmath>
 
using namespace std;
 
// целая неотрицательная степень натурального числа
inline uint64_t ipow(unsigned x, uint8_t p)
{
  uint64_t a = 1;
  while (p--) a *= x;
  return a;
}
 
// вернёт true, если х - число Армстронга
bool is_armstrong_number(uint64_t x)
{
  if (!x) return false;
  unsigned p = 1 + (unsigned)log10(x); // кол-во цифр числа
  uint64_t sum = 0;
  for (auto a = x; a; a /= 10) sum += ipow(a % 10, p);
  return x == sum;
}
 
int main()
{
  uint64_t x; // объявлеяем переменную
  cin >> x; // вводим переменную
  
  // а дальше - грёбаная магия! :))))
  cout << (is_armstrong_number(x) ? "True" : "False");
  
  return EXIT_SUCCESS;
}
Код
472335975
True
1
0 / 0 / 0
Регистрация: 14.01.2024
Сообщений: 29
14.01.2024, 15:13  [ТС] 3
Боже мой.. я ничего не понял в этом, юниты какие-то. У меня просто берётся число, его последние цифра возводится в степень в кол-во символов числа, после первое число сокращается на десяток и это обрабатывается ещё раз и это вроде логично всё выходит, без какой либо "магии". Фактически мой вопрос, это как посчитать кол-во символов в строке и записать это в переменную
0
Злостный нарушитель
9618 / 5208 / 1190
Регистрация: 12.03.2015
Сообщений: 24,607
14.01.2024, 15:17 4
Цитата Сообщение от Artix_klv01 Посмотреть сообщение
Боже мой.. я ничего не понял в этом, юниты какие-то.
Чо, не работает?
0
419 / 206 / 64
Регистрация: 13.05.2020
Сообщений: 385
14.01.2024, 15:26 5
Цитата Сообщение от Artix_klv01 Посмотреть сообщение
n=strlen(std y)
понятное дело неполадки с y, что за std?? + strlen функция для C-строк, а у вас string. Надо:
C++
1
n = y.size(); n > 0; --n;
0
0 / 0 / 0
Регистрация: 14.01.2024
Сообщений: 29
14.01.2024, 15:28  [ТС] 6
Компилятор сказал, что ошибка именно в этом
0
Злостный нарушитель
9618 / 5208 / 1190
Регистрация: 12.03.2015
Сообщений: 24,607
14.01.2024, 15:31 7
Цитата Сообщение от Artix_klv01 Посмотреть сообщение
Компилятор сказал, что ошибка именно в этом
Не надо решать эту задачу через строку. Это глупо и неэффективно. Прекрати немедленно.
1
Злостный нарушитель
9618 / 5208 / 1190
Регистрация: 12.03.2015
Сообщений: 24,607
14.01.2024, 15:31 8
Цитата Сообщение от Artix_klv01 Посмотреть сообщение
Компилятор сказал, что ошибка именно в этом
Не надо решать эту задачу через строку. Это глупо и неэффективно. Прекрати немедленно.
0
419 / 206 / 64
Регистрация: 13.05.2020
Сообщений: 385
14.01.2024, 15:37 9
Artix_klv01, а Verevkin дело говорит. Прислушайся.
0
720 / 680 / 110
Регистрация: 29.05.2015
Сообщений: 4,100
14.01.2024, 17:24 10
Цитата Сообщение от Artix_klv01 Посмотреть сообщение
Боже мой.. я ничего не понял в этом, юниты какие-то.
Это не юниты, это unsigned int, сокращённо uint. uint64_t x; - это объявление целого числа без знака размером 64 бит.
Написано конечно несколько замудрёно по современному, но разобраться можно.
0
случайный прохожий
3042 / 2075 / 627
Регистрация: 20.07.2013
Сообщений: 5,593
14.01.2024, 17:37 11
Мой "колхозный рабоче-крестьянский" вариант (__int64 = long long):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool isArmsNum (unsigned __int64 n)
{
  unsigned __int64 num = n, num2 = n, tmp, tmp2, len = int(log10(n)) + 1;
  while (num)
  {
    tmp = num % 10;
    tmp2 = pow(tmp, len);
 
    if (num2 >= tmp2)
      num2 -= tmp2;
    else
      return 0;
 
    num /= 10;
  }
 
  return !num2;
}
Пример вызова (в билдере суффикс ui64 можно заменить на ull):
C++
  isArmsNum(32164049651ui64);
0
0 / 0 / 0
Регистрация: 14.01.2024
Сообщений: 29
14.01.2024, 17:56  [ТС] 12
Теперь у меня хотя бы что-то выводит, но почему то из трёхзначного числа 153 выводит 27, после 36 и 39, то есть 3**3+3**2+3**1, почему-то оно первоначальное число оно не сокращает на 1 знак

Добавлено через 8 минут
А ещё почему-то вводя число от 1 до 9 включительно выводить False, хотя даже с таким неправильном кодом, он должен выводить правильно, я в промежутке написал cout<<s;, чтобы понимать что да как, и s == x0, то есть первоначальному числу, но почему-то выводить false.

6 // x0
6 // s
False // обрабатывания условия s==x0
0
случайный прохожий
3042 / 2075 / 627
Регистрация: 20.07.2013
Сообщений: 5,593
14.01.2024, 18:06 13
Немного "причесал" функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool isArmsNum (unsigned __int64 n)
{
  unsigned __int64 num = n, res = n, tmp, len = int(log10(n)) + 1;
  while (num)
  {
    tmp = pow(num % 10, len);
 
    if (res >= tmp)
      res -= tmp;
    else
      return 0;
 
    num /= 10;
  }
 
  return !res;
}
Artix_klv01, у тебя, судя по приведенному примеру, число с другой стороны "сокращается".
И строки, как уже сказали, нет смысла использовать. Смысл какой-то есть, только если хочешь "прикрутить" длинную арифметику.
Насчет False не ясно, никто ж не знает, что ты там с кодом сделал.
0
0 / 0 / 0
Регистрация: 14.01.2024
Сообщений: 29
14.01.2024, 18:10  [ТС] 14
Я просто делаю так, как знаю и как мне более понятно, "прикручивая" арифметику, мне кажется это более лёгким, чем разбираться с уже другими, хоть и более лёгкими вещами
0
случайный прохожий
3042 / 2075 / 627
Регистрация: 20.07.2013
Сообщений: 5,593
14.01.2024, 18:16 15
В том-то и дело, что ничего ты не "прикручиваешь", а просто пытаешься использовать строки без уважения понимания и там, где это не нужно.
И не видно кода, который выдает неверные результаты.
0
0 / 0 / 0
Регистрация: 14.01.2024
Сообщений: 29
14.01.2024, 20:19  [ТС] 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
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
    int x; // объявлеяем переменную
    cin>>x; // вводим переменную
    string y = to_string(x); //делаем из числа строку
    int s=0; // задаём второй переменной значение 0
    int x0 = x; // задаём третей переменной значение второй
    int j = y.size(); // делаем копию кол-ва цифр в числе
    for(int n = y.size(); n > 0; --n) // переменная n это кол-во чисел в цифре x, пока n не равна 0, уменьшать его на 1
        {
        int c = x % 10; // находим последнее число цифры
        int s = s + pow(c,j); // делаем действие связанное с числом Армстронга
        int x = x / 10; // сокращаем цифру на 1 число
        cout<<s<<" "; // просто в промежутке добавил, чтоб проверять
        }
    if (s == x0) // если сумма чисел в степени n равна изначальному числу, то вывести "True"
    {
        cout<<"true";
    }
    else // если нет, то вывести "False"
    {
        cout<<endl<<"False";
    }
    
}

Почистил, добавил, исправил, но вместо 153=1**3+5**3+3**3, обрабатывается 3**3+3**3+3**3, то есть переменная не берёт себе новое значение, я так предполагаю, что проблема в 15 строке.

Вывод:
153
27 54 81
False
0
случайный прохожий
3042 / 2075 / 627
Регистрация: 20.07.2013
Сообщений: 5,593
14.01.2024, 20:57 17
Лучший ответ Сообщение было отмечено Artix_klv01 как решение

Решение

Ты "объявляешь" переменные внутри цикла. В данном случае логика теряется, так как это уже "другие переменные" (с такими же именами), прочитай про "область видимости" переменных.
Попробуй следующий вариант:
C++
14
15
16
17
18
19
20
    for(int n = y.size(); n > 0; --n) // переменная n это кол-во чисел в цифре x, пока n не равна 0, уменьшать его на 1
        {
        int c = x % 10; // находим последнее число цифры
        s = s + pow(c,j); // делаем действие связанное с числом Армстронга
        x = x / 10; // сокращаем цифру на 1 число
        cout<<s<<" "; // просто в промежутке добавил, чтоб проверять
        }
Добавлено через 5 минут
Или так:
C++
14
15
16
17
18
19
  for (int n = j; n > 0; --n) // переменная n это кол-во чисел в цифре x, пока n не равна 0, уменьшать его на 1
  {
    s += pow(x % 10, j); // делаем действие связанное с числом Армстронга
    x /= 10; // сокращаем цифру на 1 число
    cout << s << " "; // просто в промежутке добавил, чтоб проверять
  }
1
0 / 0 / 0
Регистрация: 14.01.2024
Сообщений: 29
14.01.2024, 21:02  [ТС] 18
Чувак, ты лучший просто, спасибо тебе огромное, всё работает
0
случайный прохожий
3042 / 2075 / 627
Регистрация: 20.07.2013
Сообщений: 5,593
14.01.2024, 21:16 19
Не за что. Ты использовал строку (только лишь) для определения количества цифр в числе (ОКЦвЧ).
Может это и оправдано в данном случае, но (в том числе) из-за этого у тебя возникли ошибки.
Можно было использовать сразу способ (для ОКЦвЧ) через десятичный логарифм, который использовался (неоднократно) выше. Что логичней и не требует строковых переменных.
0
168 / 146 / 32
Регистрация: 03.09.2018
Сообщений: 499
14.01.2024, 22:38 20
Неужели ни у кого не возникла вопроса, если он перевёл число в строку, то просто надо вывести эту стоку по символьно?


C++
1
2
3
   for (int i = 0; i < y.length(); i++) {
        cout << y[i] << " ";
    }
Добавлено через 2 минуты
C++
1
2
3
4
5
6
    int64_t num = 12345;
    std::string str = std::to_string(num);
    
    for (char c : str) {
        std::cout << c << std::endl;
    }
0
14.01.2024, 22:38
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
14.01.2024, 22:38
Помогаю со студенческими работами здесь

Нормализованная форма записи числа представляет собой запись числа в виде
1)Нормализованная форма записи числа представляет собой запись числа в виде , если 1. 0,1...

Нормализованная форма записи числа представляет собой запись числа в виде
Подскажите правильный ответ!

Подсчет числа включений в текст заданного фрагмента (цепочки символов)
Напишите программу подсчета числа включений в текст заданного фрагмента (цепочки символов)....

Запись числа в виде строки
#include &lt;stdio.h&gt; #include &lt;locale.h&gt; //Один два три четыре пять шесть семь восемь девять...

Запись числа в экспоненциальном виде
Подскажите, пожалуйста, как записывать в код значения таких чисел, как например 6.67384 × 10-11

Константы. Запись числа в виде 10*степень
Как сделать так, чтобы константы (например постоянное Авогадро) записывались как 10* степень? Дело...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Блоги программистов
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­хронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget. . .
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin. Есть ещё регистры,. . .
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru