如何获取存储在数组中的大值模数?

Vas*_*arg 5 c arrays modulus

假设我有一个包含数字的整数数组,我想取存储在其中的模数,即

 int a[36]={1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9} 
Run Code Online (Sandbox Code Playgroud)

并将其转换为数字987654321987654321987654321987654321.

在C语言long long int允许只有10 ^ 18.我想用10 ^ 9 + 7取模数.我怎样才能做到这一点?

程序:

int main()
{
int a[36]={1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9};
long long int temp=0;
int i;
for(i=0;i<36;i++)
{
     temp=temp+a[i]*pow(10,i);
}
temp=temp%1000000007;
printf("%lld",temp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 3

由于 36 位十进制数字对于典型的 来说太多了long long,因此您需要在转换期间执行模数运算:

int a[36]={1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9};
long long int temp=0;
for(int i=35 ; i >= 0 ; i--) {
    temp = 10*temp + a[i];
    temp %= 1000000007;
}
printf("%lld",temp);
Run Code Online (Sandbox Code Playgroud)

我对您的代码做了两处更改:

  • 修复了将数字数组转换为数字的方式- 您使用的代码pow,并将较高索引处的数字视为高阶数字。一旦超过了可表示为 的 10 的最高幂,就会产生精度问题double
  • 将 移入%=循环- 您的代码通过将值保持在 0 到 1000000006(含)范围内,不会让数字溢出。

运行此代码产生的值与使用支持任意精度整数的库(我BigInteger 在这里使用 Java )获得的值相同。