假设我有一个包含数字的整数数组,我想取存储在其中的模数,即
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}
并将其转换为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;
}
答案 0 :(得分: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);
我对您的代码进行了两处更改:
pow
,并将较高索引处理的数字视为高位数字。一旦超过可以表示为double
的最高幂10,就会产生精度问题。%=
移入循环 - 您的代码不会通过将值保持在0到1000000006(包括0和1000000006)的范围内来使数字溢出。