C++ 如何在c+中检查连续片段中的数字被11整除的情况+;

C++ 如何在c+中检查连续片段中的数字被11整除的情况+;,c++,division,modulo,integer-division,greatest-common-divisor,C++,Division,Modulo,Integer Division,Greatest Common Divisor,给定一个数字num找出给定数字中有多少连续片段可以被11整除,例如给定1215598,这些连续片段可以形成: 一, 十二, 121 1215年 12155 121559 1215598 二, 二十一, 215 2155 21559 215598 一, 十五 155 1559 15598 五, 五十五 559 5598 五, 59 598 九, 98 八, 正确的答案是4,因为这些连续片段可以被11整除: 121 12155 15598 五十五 我想用C++编写一个程序来解决这个问题,但是

给定一个数字
num
找出给定数字中有多少连续片段可以被11整除,例如给定1215598,这些连续片段可以形成:

  • 一,
  • 十二,
  • 121
  • 1215年
  • 12155
  • 121559
  • 1215598
  • 二,
  • 二十一,
  • 215
  • 2155
  • 21559
  • 215598
  • 一,
  • 十五
  • 155
  • 1559
  • 15598
  • 五,
  • 五十五
  • 559
  • 5598
  • 五,
  • 59
  • 598
  • 九,
  • 98
  • 八,
正确的答案是4,因为这些连续片段可以被11整除:

  • 121
  • 12155
  • 15598
  • 五十五
我想用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++;
    }
}
#包括
#包括
#包括
使用名称空间std;
整除率为偶数(int num);
int-num;
int main()
{
int result=除数byleven(num);
返回0;
}
整除率整型偶数(整型数)
{
int计数器=0;
cin>>num;
向量arr;
while(num!=0)
{
int temp=num%10;
num=num/10;
arr.push_back(温度);
}     
反向(arr.begin(),arr.end());

对于(int i=0;i假设问题是确定10的可整除性。这将是微不足道的(寻找以零结尾的片段,唯一的复杂性是处理数字中的多个0。)。这就是我建议您从中开始的


如果以11为基数重述数字(再次查找以零结尾的片段),则测试11的可除性同样微不足道。

为了简化解决方案,我将假设比数字大的下一个基数10位正好可以用
双精度
表示(如果这不是真的,您必须找到自己的方法来编写
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;
        }
    }
}
for(自动MSD=num 1U;MSD/=10){
用于(自动LSD=MSD/10U;LSD>0U;LSD/=10U){
如果(数量%MSD/LSD%11==0U){
++计数;
}
}
}
您可以使用以下代码:

#包括
使用名称空间std;
int main()
{
int n,i,j,l=0,w,m=0;
cin>>n;
内部温度=n;
int temp2=n;
而(n!=0)
{
n=n/10;
l++;
}
int k=l;
l=(l*(l+1))/2;//数字的可能连续片段总数
int-arr[l];
l=k;
对于(i=0;i
使用系统;
使用System.Collections.Generic;
使用系统文本;
名称空间测试
{
类主类
{
公共静态void Main(字符串[]args)
{
int num=1215598;
callme(num);
Console.ReadLine();
}
公共静态无效调用(整数)
{
int mynumber=数字;
List arr=新列表();
List newarr=新列表();
`分号`
while(mynumber!=0)
{
int test=mynumber%10;
mynumber/=10;
arr.Add(测试);
}
`反向添加到另一个数组`
对于(int i=arr.Count-1,k=i;i>=0;i--,k--)
{
int cont=1;

而(cont您可以在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);
    }
}
公共类11{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
int n=1215598367,计数=0,c=0,x=0;
int t=n;
int j=10;
而(t>0){
t/=10;
计数++;
}
系统输出打印项次(计数);
int b=n;
而(b>0){
而Python中的(x解决方案:

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)
//在C编程中
#包括
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=虚拟;
while(num>0){

while(哦,您是否尝试过暴力?使用动态编程似乎是个好问题。请定义“片段”?片段是数字的连续部分,例如,如果数字为12345,则片段分别为1,2,3,4,5,12,23,34,451232344345和12345。@AdarshPandey:“分别”不相关。这正按预期工作。121 12155 15598 55欢迎使用StackOverflow。虽然此代码可能会解决问题,包括解释如何解决问题以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,您是在为中的读者回答问题未来,而不仅仅是现在提问的人。请编辑您的答案,添加解释,并说明适用的限制和假设。请查看此处→ 请为您的答案提供一些上下文,以便其他人能够轻松理解您的方法。
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)
//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;
    }