如何在C ++中按11检查连续片段中数字的可除性

时间:2018-09-12 09:18:22

标签: c++ division modulo integer-division greatest-common-divisor

给出一个数字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++;
    }
}

7 个答案:

答案 0 :(得分:1)

您可以使用以下代码:

#include<bits/stdc++.h>

using namespace std;

int main()
{
  int n,i,j,l=0,w,m=0;
  cin>>n;
  int temp = n;
  int temp2 = n;
 
  while(n!=0)
  {
    n=n/10;
    l++;
  }
  int k = l;

  l = (l*(l+1))/2;//Total number of possible continuous fragments of number
  int arr[l];
  l=k;
  for(i=0;i<l;i++)
  {
     w=(int)pow(10,i+1);
     if(i%2!=0)
       w=w+1;
     for(j=0;j<k;j++)
     {
       arr[m++] = temp%w;
       temp = temp/10;
     }
    temp = temp2;
    k--;
  }
  sort(arr,arr+m);
  for(i=0;i<m;i++)
  {
     if(arr[i]%11==0)
     cout<<arr[i]<<" ";
  }
}

答案 1 :(得分:1)

您可以在 Java 中执行此操作 .....................

public class Eleven {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int n =1215598367,count = 0,c=0,x=0;
        int t=n;
        int j=10;
        while(t>0) {
            t/=10;
            count++;
            }
        System.out.println(count);
        int b = n;
        while(b>0) {
        while(x<count) {
                int a = b%j;
                System.out.println(a);
                if(a%11==0) {
                    c++;
                }   
                x++;
                j*=10;
        }
        b=b/10;
        x=0;
        count = count-1;
        j=10;
        }
        System.out.println(c);
    }
}

答案 2 :(得分:0)

想象一下,问题是要确定10的可除性。这将是微不足道的(寻找以0结尾的片段,唯一的复杂性是处理数字中多个0。)。我建议您从这里开始。

如果您重新声明基数为11的数字,那么用11进行除数测试就很简单了。(同样,请查找以0结尾的片段。)

答案 3 :(得分:0)

为简化解决方案,我假设比数字大的下一个10位数字可以用double精确地表示出来(如果不正确,您将必须找到自己的写powfloorlog10的方式)。鉴于此,您的输入存储在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;
        }
    }
}

Live Example

答案 4 :(得分:0)

using System;
using System.Collections.Generic;
using System.Text;
namespace test
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            int num = 1215598;
            callme(num);
            Console.ReadLine();
        }
        public static void callme(int number)
        {
            int mynumber = number;
            List<int> arr = new List<int>();
            List<int> newarr = new List<int>();
`separating numbers `
            while (mynumber != 0)
            {
                int test = mynumber % 10;
                mynumber /= 10;
                arr.Add(test);
            }
`reverse add to another array`
            for (int i = arr.Count - 1, k = i; i >= 0; i--, k--)
            {
                int cont = 1;
                while (cont <= i + 1)
                {
                    StringBuilder str = new StringBuilder();
                    for (int j = 0; j < cont; j++)
                    {
                        str.Append(arr[k - j]);
                    }
                    newarr.Add(Convert.ToInt32(str.ToString()));
                    cont++;
                }
            }
`divide and print`
            foreach (int val in newarr)
            {
                if (val % 11 == 0)
                    Console.WriteLine(val);
            }

        }
    }
}

答案 5 :(得分:0)

Python 中的解决方案:

def DivisibilityByEleven(num):
    str_num = str(num)
    count = 0
    for i in range(len(str_num)):
        for j in range(len(str_num)):
            my_num = str_num[i:j+1]
            if my_num != '':
                if int(my_num) % 11 == 0:
                    count += 1
    return count

if __name__ == '__main__':
    num = int(input())
    result = DivisibilityByEleven(num)
    print(result)

答案 6 :(得分:0)

//IN C programming
  #include <stdio.h>
    int main()
    {
        int num=1215598,c=10,l=0,n=10,a=0,d,count=0,dummy,o=0,num1;
        dummy=num;
        while(num)
        {
            num=num/10;
            a++;
        }
        num=dummy;
       while(num>0){
        while(o<a)
        {
            d=num%c;
            printf("%d\n",d);
            if(d%11==0)
            {
                //printf("%d",d);
                count++;
            }
            c*=10;
            o++;
        }
        num=num/n;
        c=10;
        a-=1;
        o=0;
       }
       printf("\n%d",count);
        return 0;
    }