LINUX.ORG.RU

Д/з по С++


1

3

Вот, собсно, само задание:

Дано натуральное число а (a≤100). Напишите программу, определяющую количество цифр в этом числе, сумму его цифр, выводящую на экран первую и последнюю цифру через два пробела.
Что-то ничего в голову не лезет, помогите пожалуйста

★★★★★

>Дано натуральное число а (a≤100). Напишите программу, определяющую количество цифр в этом числе, сумму его цифр, выводящую на экран первую и последнюю цифру через два пробела.

Написал. Спасибо.

anonymous
()

> Что-то ничего в голову не лезет, помогите пожалуйста

Если б ты продемонстрировал, что хоть что-то пытался сделать, тебе бы, может, кто-нибудь бы и помог. А так — NYPA.

geekless ★★
()

Злые все какие... печатаешь его в какой нить буфер, потом посимвольно обрабатываешь.

AIv ★★★★★
()

Сделаю быстро, качественно и недорого. $100, стопроцентная предоплата.

Manhunt ★★★★★
()

Преобразовать число в строку с помощью функции itoa, а дальше уже вытаскиваешь из строки первый и последний символ.

сумму чисел - функцией atoi преобразуешь символ в число и суммируешь каждый символ строки.

кол-во цифр - sizeof в помощь.

Punk
()

Читай Александреску, главу про «Списки типов». Делай по аналогии, только вместо типов будут цифры. Заодно программа расширится на числа >100.

anonymous
()
Ответ на: комментарий от dave

>Это будет быдлокодинг.

Ну почему, метод решения через преобразование в строку не намного хуже метода через деления и остатки. Особенно в такой конкретной задаче.

anonymous
()

Раздели целочисленным делением на 10 потом ещё на 10 и так до тех пор пока ноль не получишь. Догадайся чему будет равно количество итераций. Д/з: модифицировать алгоритм для выведения первой и последней цифры самостоятельно.

KblCb ★★★★★
()

Для такого короткого диапазона можно результаты затабулировать.

const86 ★★★★★
()

Ъ-быдлокод, C++

#include <iostream>

template <int n>
struct Solution
{
  static const int count = Solution<n / 10>::count + 1;
  static const int sum = Solution<n / 10>::sum + n % 10;
  static const int last = n % 10;
  static const int first = Solution<n / 10>::first;
};

#define DECLARE_ONE_DIGIT_SOLUTION(n) template <>\
                                      struct Solution<n>\
                                      {\
                                        static const int count = 1;\
                                        static const int sum = n;\
                                        static const int last = n;\
                                        static const int first = n;\
                                      };

DECLARE_ONE_DIGIT_SOLUTION(0)
DECLARE_ONE_DIGIT_SOLUTION(1)
DECLARE_ONE_DIGIT_SOLUTION(2)
DECLARE_ONE_DIGIT_SOLUTION(3)
DECLARE_ONE_DIGIT_SOLUTION(4)
DECLARE_ONE_DIGIT_SOLUTION(5)
DECLARE_ONE_DIGIT_SOLUTION(6)
DECLARE_ONE_DIGIT_SOLUTION(7)
DECLARE_ONE_DIGIT_SOLUTION(8)
DECLARE_ONE_DIGIT_SOLUTION(9)

int main()
{
  const int number = 1024; // <-- то самое число a

  std::cout << "Number of digits: " << Solution<number>::count << std::endl;
  std::cout << "Sum: " << Solution<number>::sum << std::endl;
  std::cout << "Last digit: " << Solution<number>::last << std::endl;
  std::cout << "First digit: " << Solution<number>::first << std::endl;

  return 0;
}
Raving_Zealot ★★
()

f1xmAn> Д/з

Лекции открой, там наверняка все написано. А если не ходил - ССЗБ.

vurdalak ★★★★★
()
Ответ на: Ъ-быдлокод, C++ от Raving_Zealot

>Ъ-быдлокод, C++

Круто, блин.

fixman, бери и бегом сдавать.

anonymous
()
Ответ на: Ъ-быдлокод, C++ от Raving_Zealot

Это не Ъ! Где перегрузка операторов, почему не использовано наследование??? Нету! Как вам не стыдно такие программы на лоре публиковать ?!

anonymous
()
#include <iostream>
#include <string>

class NumberInfo {
public:
    NumberInfo(unsigned int n): m_number(n) {}

    // определяющую количество цифр в этом числе
    unsigned int digitCount() {
        if (m_number < 10) return 1;
        if (m_number < 100) return 2;
        return 3;
    }

    // сумму его цифр
    unsigned int digitSum() {
        // if (m_number == 0) return 0; // uncomment if zero is also included in natural numbers
        if (m_number == 1) return 1;
        if (m_number == 2) return 2;
        // ...
        if (m_number == 11) return 2;
        // ...
        if (m_number == 99) return 18;
        if (m_number == 100) return 1;
        std::cerr << __PRETTY_FUNCTION__ << ": implement me for number " << m_number << std::endl;
        return 0;
    }

    // выводящую на экран первую и последнюю цифру через два пробела
    void digitBoundary() {
        if (m_number < 10) {
            std::cout << m_number << "  " << m_number << std::endl;
        } else if (m_number < 100) {
            std::string number = toString(m_number);
            std::cout << number[0] << "  " << number[1] << std::endl;
        } else if (m_number == 100) {
            std::cout << "1  0" << std::endl;
        }
    }

private:
    template<class T>
    std::string toString(T i) {
        std::stringstream ss;
        std::string s;
        ss << i;
        s = ss.str();
        return s;
    }

    unsigned int m_number;
};

int main(int argc, char **argv) {
    for (unsigned int n = 1; n <= 100; ++n) {
        NumberInfo info(n);
        std::cout << n 
                  << ", count: " << info.digitCount() 
                  << ", sum: " << info.digitSum() 
                  << ", boundary: ";
        info.digitBoundary();
    }
    return 0;
}

Не так уж и сложно, не правда ли?

rival ★★
()
Ответ на: Ъ-быдлокод, C++ от Raving_Zealot

Надо доработать! Истинный Ъ-быдлокод типа такого:

template <int n>
struct Solution_Count
{
  static const int count = Solution_Count<n / 10>::count + 1;
};

template <int n>
struct Solution_SumCount : public Solution_Count<n>
{
  static const int sum = Solution_SumCount<n / 10>::sum + n % 10;
};

и т.д.

anonymous
()
Ответ на: комментарий от ados

Александреску, «Современное проектирование на C++».

anonymous
()
Ответ на: комментарий от Manhunt

Сумму цифр печатать долго :(

unsigned int sum_tbl[] = {
  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
  1,  2,  3,  4,  5,  6,  7,  8,  9, 10,
  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,
  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
  9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
  1
};

return sum_tbl[m_number];
Так лучше?

rival ★★
()
Ответ на: комментарий от rival

А чтобы это

        if (m_number == 1) return 1;
        if (m_number == 2) return 2;
        // ...
        if (m_number == 11) return 2;
        // ...
        if (m_number == 99) return 18;
        if (m_number == 100) return 1;
вручную не писать, написать сначала программку, генерирующую данный исходник :)

Eddy_Em ☆☆☆☆☆
()
#include <iostream>

using namespace std;

int main (){
  cout << "Введите целое число: " << flush;
  int x;
  cin >> x;
  cout << "Для расчетов используется " << x << "-ичная система счисления." << endl;
  cout << "Количество цифр: " << x << endl;
  cout << "Сумма цифр: " << x << endl;
  cout << "Первая и последняя цифра через два пробела: " << x << " " << " " << x << endl;
  cout << "Спасибо! Пользуйтесь нашей программой еще!" << endl;
  return 0;
}
Dimanc ★★
()
Ответ на: комментарий от Eddy_Em

> написать сначала программку, генерирующую данный исходник :)
Тоже вариант.

rival ★★
()
Ответ на: комментарий от rival

> Так лучше?

Ты пожертвовал if-ами. Не Ъ.

:)))))

Manhunt ★★★★★
()
Ответ на: комментарий от Dimanc

Заметьте, без циклов, массивов и условий, в отличии от некоторых неумелых программистов.

PS fix: s/целое/целое положительное/;

Dimanc ★★
()
Ответ на: комментарий от Eddy_Em

Ъ-быдлокодер своими генераторами кода никогда не будет пользоваться, хватает копипаста.

anonymous
()
Ответ на: комментарий от Dimanc

> cout << «Количество цифр: » << x << endl;
Every base is base 10, так что будет скорее 2, нежели x, либо 1, если x+1-ичная.

rival ★★
()
Ответ на: комментарий от LongLiveUbuntu

Как мы это делали студентами на Паскале

По первому пункту.

int numDigits = 1;
for(a/10 > 0; a /= 10; numDigits++)

По второму.

int sumDigits = 0;
do {
  sumDigits += a%10;
}while(a/10 > 0)
LongLiveUbuntu ★★★★★
()

В ведь красиво наброшено!

aedeph
()
Ответ на: комментарий от rival

fix

#include <iostream>

using namespace std;

int main (){
  cout << "Введите целое положительное число: " << flush;
  int x;
  cin >> x;
  cout << "Для расчетов используется " << x+1 << "-ичная система счисления." << endl;
  cout << "Количество цифр: " << 1 << endl;
  cout << "Сумма цифр: " << x << endl;
  cout << "Первая и последняя цифра через два пробела: " << x << " " << " " << x << endl;
  cout << "Спасибо! Пользуйтесь нашей программой еще!" << endl;
  return 0;
}

Все, я написал идеальную программу.

Dimanc ★★
()

странно что не вылезло ни одного лиспера, который показал бы как это делается на Ъ языке. на лиспе эта задача не решается?

Rastafarra ★★★★
()
Ответ на: комментарий от Rastafarra

Просили же на С++. Видимо лисперы решили не офтопить и скромно молчат. Хотя могли бы показать класс.

anonymous
()
Ответ на: комментарий от Rastafarra

>странно что не вылезло ни одного лиспера, который показал бы как это делается на Ъ языке.

Тут был один, который из программы на c++ вызвал бы sbcl и посчитал с помощью него, но его забанили...

Dimanc ★★
()
Ответ на: комментарий от rival

ого, респект. сам хотел в том же духе ответить.

почти тру-код, для ответа. только void digitBoundary() - тоже ифами надо бы имхо )

супер xDDDDD я в восторге )))))

dpt-ru
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.