Member 13970073 Ответов: 2

Как мне решить следующий вопрос


Учитывая число n выясните сколько фрагментов данного числа делится на 11 например:

Ввод:

1215598
Выход:

4
Числа 55,121,12155,15598 являются непрерывными фрагментами числа, которые делятся на 11.

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

Что я уже пробовал:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int DivisibilityByEleven(int num);
int num;
int main()
{
   int result=DivisibilityByEleven(num);
   return 0;
}

int DivisibilityByEleven(int num)
{
    int counter=0;
    cin>>num;   
    vector<int> arr;
    while(num!=0)
    {
        int temp=num%10;
        num=num/10;
        arr.push_back(temp);
    }     
    reverse(arr.begin(),arr.end());
    for(int i=0;i<arr.size();i++)
    {
        cout<<arr[i];
    }

    if(num%11==0)
    {
        counter++;
    }
}

CHill60

Что не так с кодом, который у вас уже есть?

Member 13970073

это просто взятие целочисленного значения в массив
Мне нужно, чтобы разбить ее на фрагменты

2 Ответов

Рейтинг:
8

CPallini

Я бы использовал строковое представление числа:

#include <iostream>
#include <sstream>

using namespace std;

// get the integer corresponding to the substring starting at 'pos', having length 'len'
int slice_to_int(const string & str, size_t pos, size_t len)
{
  istringstream iss(str.substr(pos, len));
  int n;
  iss >> n;
  return n;
}

int main()
{
  int n = 1215598;

  ostringstream oss;
  oss << n;

  string s = oss.str(); // get the string representation of the number

  size_t len = s.length();
  size_t count = 0;

  for (size_t i = 0; i<len-1; ++i)
  {
    for (size_t j = 2; j <= (len - i) ; ++j)
    {
      int k = slice_to_int( s, i, j);
      if ( (k % 11) == 0)
      {
        ++count;
      }
    }
  }

  cout << "count = " << count << endl;
}


Рейтинг:
12

OriginalGriff

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

Подумайте о задаче: сколько существует "смежных фрагментов" входного числа?
Минимальный размер фрагмента равен 2 (или он не делится на 11), а максимальный - целая длина числа 7 (или если это не допускается, то на единицу меньше-6)
Это означает, что все смежные фрагменты являются:

12, 21, 15, 55, 59, 98,
121, 215, 155, 559, 598,
1215, 2155, 1559, 5598,
12155, 21559, 15598,
121559, 215598,
1215598
Они легко решаются с помощью пары вложенных циклов.
Тогда все, что вам нужно сделать, это проверить каждый фрагмент на делимость, и это тривиально: оператор модуля "%" сделает это за вас!
Попробуйте сами, возможно, вы обнаружите, что это не так сложно, как вы думаете!

Если вы столкнетесь с конкретной проблемой, то, пожалуйста, спросите об этом, и мы сделаем все возможное, чтобы помочь. Но мы не собираемся делать все это для вас!


jsc42

Незначительная опечатка: в списке 2-значных комбинаций значения должны быть
12, 21, 15, 55, 59, 98

OriginalGriff

Исправлено! (Мои пальцы опять были явно не в том направлении...)