当分母超出无符号long long int边界时,如何使用模数?

时间:2019-08-07 16:12:58

标签: c++ modulo

给定1≤N≤10 18 和1≤K≤10 18 ,我该怎么做N%K 2 ?当K接近值10 18 时,K 2 (分母)超出无符号long long int的范围,因此我无法存储值K2。

2 个答案:

答案 0 :(得分:0)

您真的不需要bigint库,因为

  • 如果K> 10 9 ,则K 2 > 10 18 > N,因此N%K 2 =N。无需计算K 2
  • 如果K⩽10 9 ,则可以使用正常的N % (K*K)计算uint64_t而不会溢出

FWIW在大多数现代编译器中,在64位模式下也有128位类型。 GCC,Clang和ICC称之为__int128

请参见Is there a 128 bit integer in gcc?

答案 1 :(得分:0)

如果 K 2 大于 N ,则 N%K 2 >等于 N

示例:

  

253%17 2 = 253%289 = 253

假设使用64位<body> <form name="question1" onsubmit="return false;"> <legend>La première balise présente dans un fichier html doit être:</legend> <input type="radio" id="choix1" name="Q1" value="0"> <label for="head" id="head1">head</label> <input type="radio" id="choix2" name="Q1" value="0"> <label for="body" id="head2">body</label> <input type="radio" id="choix3" name="Q1" value="1"> <label for="!DOCTYPE" id="head3">!DOCTYPE</label> <input type="radio" id="choix4" name="Q1" value="0"> <label for="html" id="head4">html</label> <button onclick="validateQuestion1(document.forms.question1.Q1)" id="valider1">Valider</button> </form> </body>,则可以平方而不会溢出的最大值为2 32 -1,等于0xFFFFFFFF(或4'294'967'295)。

因此,您只需输入以下代码即可:

unsigned long long