如何在C ++中检查7为大数字的除法?

时间:2009-10-11 14:07:22

标签: c++ math biginteger

我必须检查一下,如果给定的数字可以被7整除,这通常是通过像n % 7 == 0那样做的,但问题是,给定的数字最多可以有100000000,这不适合即使在long long

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

我希望数字在stdin上,输出为1 / 0

这是一个例子

34123461273648125348912534981264376128345812354821354127346821354982135418235489162345891724592183459321864592158
0

应该可以仅使用大约7个整数变量和cin.get()。它也应该只使用标准库来完成。

10 个答案:

答案 0 :(得分:26)

你可以使用一个关于除以7的已知规则来说: 从右边开始将每个3位数组合在一起并开始相减,然后将结果的可分性与原始数字相同:

例如:

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!

此规则还有其他替代方案,都很容易实现。

答案 1 :(得分:18)

想想你如何在纸上进行分工。你看第一个或第二个数字,并记下最接近的七个数,然后记下余数,依此类推。你可以在任何一个长度数上执行此操作,因为您不必将整个数字加载到内存中。

答案 2 :(得分:13)

大多数divisibility by seven规则都适用于数字级别,因此在字符串上应用它们应该没有问题。

答案 3 :(得分:3)

您可以计算模数为7的数值。

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

这具有独立于除数7或基数10的优点。

答案 4 :(得分:1)

我首先减去一些可以被7整除的大数字。

可被7整除的数字示例包括700,7000,70000,140000000,42000000000等。

在您给出的特定示例中,尝试减去280000000000(一定数量的零)0000。

更容易实现,重复减去最大可能的数字,如70000000000(一定数量的零)0000。

答案 5 :(得分:1)

  

您可以计算模数为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,而且适用于任何除数。

答案 6 :(得分:0)

因为我最近做过处理分解数字的工作,我会暗示要获得具体的数字 - 这是你需要的其他一些答案 - 考虑整数除法并使用模数来获取数字

如果您的号码较小,请说123,您如何获得123?特别是因为你在10号基地工作......

答案 7 :(得分:0)

N = abc

有一种简单的算法可以验证三位数是7的倍数:

用x替换a并将其添加到bc,x为数字为2的数十位数,其中数百为a。

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 mod7≡1; 1 + 4 + 34 = 39; 7ł39和7łN

N = 341.234.612.736.481

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

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

此规则可以完全通过心理计算应用,并且非常快。 它源于我在2.005中创建的另一条规则。它适用于任何数量的数字和13的可分性。

答案 8 :(得分:0)

这是一种通过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整除。

请参阅Divisibility rules

答案 9 :(得分:-1)

首先在字符串中取出那个大数字然后对字符串的每个数字求和。最后检查是否(总和%7 == 0)

代码:

 $(".chosen-search input").on('keyup', function(e) {
      console.log($(this));
  })