如何通过7在C ++大数检查师?(How to check for division by 7 fo

2019-07-22 01:20发布

我要检查,如果给定的数字整除7,这是usualy做喜欢的事,只是做了n % 7 == 0 ,但问题是,给定数量最多可以有1亿,这甚至不适合long long

另一个约束是,我只有可用内存几千字节,所以我不能使用数组。

我期待数为标准输入和输出为1 / 0

这是一个例子

34123461273648125348912534981264376128345812354821354127346821354982135418235489162345891724592183459321864592158
0

应该可以只使用约7整型变量和做cin.get() 它应该只使用标准库也做。

Answer 1:

想想你是怎么做到在纸上师。 看看你的第一个数字或两个,并写下七个最近多,扛下来的余数,等等。 你可以做任何abritrary长度的数字,因为你没有在整数加载到内存中。



Answer 2:

您可以通过7,说使用大约师已知规则:每个组3位一起从右边开始,并开始减和alternativly加入他们,由7结果的可分性是一样的原始号码:

例:

testing 341234612736481253489125349812643761283458123548213541273468213
        549821354182354891623458917245921834593218645921580

   (580-921+645-218+593-834+921-245+917-458+623-891+354-182
    +354-821+549-213+468-273+541-213+548-123+458-283+761-643
    +812-349+125-489+253-481+736-612+234-341 
    = 1882 )
    % 7 != 0 --> NOK!

有其他选择这个规则,所有容易实现。



Answer 3:

大多数的七条整除规则工作在位数水平,所以你应该没有问题,将它们施加在你的字符串。



Answer 4:

你可以计算出数模7的价值。

也就是说,对于每个数字d和数值n到目前为止计算N =(10 * N + d)%7。

这具有这样的除数7或底座10的独立工作的优点。



Answer 5:

我想减去一些大的数量是7整除启动。

其通过7整除数的实例包括700,7000,70000,1.4亿,420亿等

在你给的特殊例子,尝试减去2800亿(一些数量的零)0000。

甚至更容易实现,反复减去700亿一样最大可能数(一些数量的零)0000。



Answer 6:

你可以计算出数模7的价值。

也就是说,对于每个数字d和数值n到目前为止计算N =(10 * N + d)%7。

这具有这样的除数7或底座10的独立工作的优点。

我解决了这个问题正是编程竞赛的一个相同的方式。 这里的代码,你需要的片段:

int sum = 0;
while (true) {
  char ch;
  cin>>ch;
  if (ch<'0' || ch>'9') break; // Reached the end of stdin
  sum = sum*10; // The previous sum we had must be multiplied
  sum += (int) ch;
  sum -= (int) '0'; // Remove the code to get the value of the digit
  sum %= 7; 
}

if (sum==0) cout<<"1";
else cout<<"0";

此代码工作得益于模块化的算术简单的规则。 它也不仅仅是为7,但实际上任何除数。



Answer 7:

因为我最近做的工作处理分手的数字,我会提示,要得到具体的数字 - 这是你所需要的一些其他的答案 - 想想整数除法和使用模量得到的数字出来。

如果你有一个较小的数字,说123 ,你将如何得到1中, 23出来的吗? 特别是因为你在基地10个工作...



Answer 8:

N = ABC

有一个简单的算法,以验证是否一个三位数字是7的倍数:

用x替换一个,并将其添加到卑诗省,是X几十7两位数的数倍,其数百是的。

N = 154; X = 2; 2 + 54 = 56; 7 | 56和7 | 154

N = 931; X = 4; 4 + 31 = 35; 7 | 35和7 | 931

N = 665; X = 5; 5 + 65 = 70; 7 | 70和7 | 665

N = 341; X = 6; 6 + 41 = 47; 7ł47和7ł341

如果N是由各个时期形成的一个周期的结果的逆添加剂必须被添加到下一个周期,这样的总和:

N = 341.234

6 + 41 = 47; - 41 MOD 7≡1; 1 + 4 + 34 = 39; 7ł39和7łN

N = 341.234.612.736.481

为341.234结果是39.这个结果我们继续:

-39 MOD 7≡3; 3 + 5 + 6 + 1 + 2 + 1 = 18; - 18模7≡3; 3 + 0 + 36 = 39; - 39 MOD 7≡3; 3 + 1 + 81 = 85; 7ł85和7łN

这个规则可以完全通过心算被应用,是非常快的。 这是从我在2.005创造了另一个规则的。 它适用于任何规模的数量和由13整除。



Answer 9:

这里有一个简单的方式通过7检查整除:

乘以每个数字在此模式[1,3,2,6,4,5](或开始对给定数量的右手侧由相应的数字[1,3,2,-1,-3,-2 ])。 重复模式是必要的。 如果产品的总和为7整除的,那么原来的号码。

例如:2016(6 * 1 + 1 * 3 + 0×2 + 2 * 6 = 21)是由7自21是由7整除整除。

见整除规则 。



Answer 10:

起初以字符串中的大号码,然后总结字符串的每个数字。 最后一次查看如果(总和%7 == 0)

码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long int n,i,j,sum,k;
    sum=0;
    string s;
    cin>>s;
    for(i=0;i<s.length();i++)
    {
        sum=sum+(s[i]-'0');
    }

    if(sum%7==0)
    {
        printf("Yes\n");
    }
    else
    {
        printf("No\n");
    }

    return 0;
}


文章来源: How to check for division by 7 for big number in C++?