大数求余。

最初并没有在意一个数的求余运算。因为“%”就是求余的。而后来在一次比赛的题目上出了一道题就是求余。这是数很大位数可以达到1000位。我一看就蛋疼了。唉,别人都A了这道水题。我却无从下手。

分析此题:把输入的当作字符串读入。再对取出每位减去48得到整型。然后应用同余定理,即可求出。

如果知道这种方法,这题真的很水了。

#include<stdio.h>
#include<string.h>
                                //本题应用了 (a*b)%c=((a%c)*(b%c))%c ;
int row( int k,int n)          //(a+b)%c=(a%c+b%c)%c  对于多个相乘,相加也类似。 
{  
  int f=1,r=1,i;
  for(i=0;i<k/6;i++)         //降位,每次降六位(因为六位数可以求余) 
    f*=1000000%n;
  for(i=0;i<k%6;i++)
     r*=10;
  return f*(r%n)%n;
} 
         
int main()
{  
    char a[1001];
    int n,k,k1,c,b;
    while(scanf("%s",a)!=EOF)
    {  
       int sum=0;
       scanf("%d",&n);
       k1=k=strlen(a)-1;
       for(int i=0;i<=k;i++)
       {
        c=(a[i]-48)%n;
        b=row(k1--,n);
        sum+=(c*b)%n;
        }
        if(sum%n==0)
        printf("YES\n");
        else
        printf("%d\n",sum%n);
      }
    return 0;
}

  

posted on 2013-04-15 21:22  青竹士  阅读(560)  评论(0编辑  收藏  举报

导航