Форматирование запятых в длинное целое - PullRequest
1 голос
/ 24 сентября 2019

я впервые задаю вопрос.Я надеялся получить помощь по очень старому заданию по информатике, которое я так и не удосужился закончить.Я больше не беру класс, просто хочу посмотреть, как это решить.

Считать целое число (любое допустимое 64-битное целое число = тип long long) и вывести то же число, но сзапятые вставлены.

Если пользователь ввел -1234567890, ваша программа должна вывести -1,234,567,890.Comm должен отображаться после каждых трех значащих цифр (при условии, что осталось больше цифр), начиная с десятичной точки и работая влево до более значимых цифр.Если введенный номер не требует запятых, не добавляйте их.Например, если вход 234, вы должны вывести 234. Вход 0 должен выдать выход 0. Обратите внимание, что в приведенном выше примере число может быть положительным или отрицательным.Ваш вывод должен соответствовать регистру ввода.

Я относительно новичок в программировании, и это было все, что я мог придумать:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
  long long n;
  cout << "Enter an integer:" << endl;

    cin >> n;

        int ones = n % 10;
        int tens = n / 10 % 10;
        int hund = n / 100 % 10;
        int thous = n / 1000 % 10;
        int tthous = n / 10000 % 10;

    cout << tthous << thous << "," << hund << tens << ones << endl;

  return 0;
}

Исходное назначение запрещеноиспользование строк, массивов и векторов, поэтому, пожалуйста, воздержитесь от предоставления предложений / решений, связанных с ними. Я знаю, что для правильной вставки запятых в нужных местах, вероятно, потребуется какой-то цикл for, но я просто не знаю, как это осуществить.

Заранее благодарю всех, кто предлагает свою помощь!

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Просто, чтобы дать вам представление о том, как решить эту проблему, я описал простую реализацию.Просто помните, что это простой пример:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
  long long n = -1234567890;

  if ( n < 0 )
    cout << '-';

  n = abs(n);

  for (long long i = 1000000000000; i > 0; i /= 1000) {
    if ( n / i <= 0 ) continue;
    cout << n / i ;
    n = n - ( n / i) * i;
    if ( n > 0 )
       cout << ',';
  }

  return 0;
}

http://coliru.stacked -crooked.com / a / 150f75db89c46e99

1 голос
/ 24 сентября 2019

Простым решением будет использование ios::imbue для установки локали, которая сделает всю работу за вас:

std::cout.imbue(std::locale(""));
std::cout << n << std::endl;

Однако, если ограничения не допускают string с илиvector s Я сомневаюсь, что это будет правильным решением.Вместо этого вы можете использовать рекурсию:

void print(long long n, int counter) {
    if (n > 0) {
        print(n / 10, ++counter);
        if (counter % 3 == 0) {
            std::cout << ",";
        }
        std::cout << n%10;

    }
}

void print(long long n) { 
    if (n < 0) {
        std::cout << "-";
        n *= -1;
    }
    print(n, 0); 
}

А затем в основном просто позвоните print(n);

...