Как проверить делимость числа на непрерывные фрагменты на 11 в c ++ - PullRequest
0 голосов
/ 12 сентября 2018

По заданному числу num выяснить, сколько непрерывных фрагментов данного числа делится на 11, например, учитывая 1215598, эти непрерывные фрагменты могут быть сформированы:

  • 1
  • 12
  • 121
  • 1215
  • 12155
  • 121559
  • 1215598
  • 2
  • 21
  • 215
  • 2155
  • 21559
  • 215598
  • 1
  • 15
  • 155
  • 1559
  • 15598
  • 5
  • 55
  • 559
  • 5598
  • 5
  • 59
  • 598
  • 9
  • 98
  • 8

Правильный ответ будет 4потому что эти непрерывные фрагменты делятся на 11:

  • 121
  • 12155
  • 15598
  • 55

Я хочу написать программу на 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++;
    }
}

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Чтобы упростить решение, я предполагаю, что следующая базовая цифра на 10 больше, чем число, равно точно , представляемое double (если это не так, вам придется найтиваш собственный способ написать pow, floor и log10).Учитывая это, ваш ввод хранится в num, а вы храните счет в count, вы действительно просто хотите найти все «подстроки» вашего числа.Что лучше всего сделать, просто выбрав все допустимые комбинации начальных и конечных символов:

for(auto MSD = num <= 0 ? 1U : static_cast<unsigned>(pow(10.0, floor(log10(num)) + 1.0)); MSD > 1U; MSD /= 10) {
    for(auto LSD = MSD / 10U; LSD > 0U; LSD /= 10U) {
        if(num % MSD / LSD % 11 == 0U) {
            ++count;
        }
    }
}

Живой пример

0 голосов
/ 12 сентября 2018

Представьте себе, что вопрос заключался в том, чтобы определить делимость на 10. Это было бы тривиально (ищите фрагменты, заканчивающиеся на ноль, единственное осложнение связано с более чем одним 0 в числе.). Это то, что я предлагаю вам начать.

Проверка делимости на 11 также тривиальна, если вы переформулируете число с основанием 11. (Опять же, ищите фрагменты, заканчивающиеся на ноль.)

...