如何使用一个很长的整数来计算C ++中的值?

时间:2014-09-10 13:50:20

标签: c++ modulo

我需要计算(n*(2n+1)*(n+1)*(3(n^2)+3n+1))/30 modulo m其中: - 30& m可以是非共同素数 - n的值最高可达10^10long long int太大) - m可以包含高达10000的任何值

我试过这个:

long long int tp1;
double k;
k=n;
k=k*((2*n)+1);
k=k*(n+1);
k=k*((3*n*n)+(3*n)-1);
tp1=fmod(k/30,m);

2 个答案:

答案 0 :(得分:3)

As noted by molbdnilo,你可以用一定数量的模数进行所有计算。

扩展这个想法:

  • (x * y) mod m((x mod m) * (y mod m)) mod m
  • 相同
  • (x + y) mod m((x mod m) + (y mod m)) mod m
  • 相同

然而

  • (x / y) mod m((x mod m) / (y mod m)) mod m
  • 不同

因此,您必须计算n*(2n+1)*(n+1)*(3(n^2)+3n+1) mod (30 * m),并将其除以30。

P.S。我假设除法运算与c ++相同,“除以四舍五入”。

答案 1 :(得分:1)

对于非常长的整数,请使用Gnu项目中的GMP。 GMP

使用c ++变体(gmpxx),您只需要将您的数字改为:

mpz_class number;

你可以像这样完成你的计算:

number = k*((3*n*n)+(3*n)-1);

其中k和n可以是int或mpz_class(或许多其他)。

我希望这会对你有所帮助!