给出一个数字num
,找出给定数目的连续片段可以被11整除,例如,给定1215598,可以形成以下连续片段:
正确的答案是4,因为这些连续的片段可以被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++;
}
}
答案 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
精确地表示出来(如果不正确,您将必须找到自己的写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;
}
}
}
答案 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;
}