Modulo 10 ^ 9 + 7用户扫描的号码

时间:2018-04-07 16:57:09

标签: c casting overflow modulo

我有一个以变量计数存储的数字。我必须扫描数字N(最大尺寸10 ^ 18),然后将变量计数乘以10 ^(N-2),然后计算其模数(10 ^ 9 + 7)。我试着这样做

#include <stdio.h>
#include <stdlib.h>
#include<math.h>

int main()
{
    int T,w;
    char ch='0';
    unsigned long long int M=1000000007;

    unsigned long long int i,N,count;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%llu %d",&N,&w);

           if(w==0 || w==-1)
            count=9;
           else if(w==1 || w==-2)
            count=8;
          else if(w==2 || w==-3)
            count=7;
           else if(w==3 || w==-4)
             count=6;
        else if(w==4 || w==-5)
            count=5;
            else if(w==5 || w==-6)
            count=4;
            else if(w==6 || w==-7)
            count=3;
           else if(w==7 || w==-8)
            count=2;
            else if(w==8 || w==-9)
            count=1;
           else
           count=0;
        count = count*pow(10,N-2)%M;
        printf("%llu\n",count);

     }
}

但是,1)因为pow返回double并且%希望它的两个操作数都是int,它会产生编译错误2)Typecasting无济于事,因为没有数据类型可以存储大小的值 (10)^(10 ^ 18)

我如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

只需创建自己的整数幂函数,或者在这种情况下更简单地使用整数exp10函数:

unsigned long long exp10i( unsigned n )
{
    unsigned long long e = 1 ;
    for( unsigned p = 0; i < n; p++ )
    {
        e *= 10u ;
    }

    return e ;
}

然后:

count = (count * exp10i( N-2 )) % M;