【大数取模】HDOJ-1134、CODEUP-1086

1086: 大数取模

 

题目描述

现给你两个正整数A和B,请你计算A mod B。
为了使问题简单,保证B小于100000。

输入

输入包含多组测试数据。每行输入包含两个正整数A和B。A的长度不超过1000,并且0<B<100000。

输出

对于每一个测试样例,输出A mod B。

样例输入

2 3 12 7 152455856554521 3250

样例输出

2 5 1521

 

【概念】

  (a+b)%n =(a%n+b%n)%n

  (a-b)%n = (a%n-b%n)%n

  实话说刚开始我没看懂。

  代码:

 1 int mod(char str[],int num)

 2 {

 3     int number[MAXN],i,d = 0;

 4     int len = strlen(str);

 5     //将字符串数组转化为数字数组

 6     for(i = 0;i < len;i++)

 7         number[i]=str[i]-'0';

 8     int remainder=0;

 9     for(i = 0;i < len;i++)

10     {

11         remainder=(remainder * 10 + number[i]) % num;

12     }

13     return remainder;

14 }

  举个例子:

    123 % 4 = 3

    -1-  (0 * 10 + 1) % 4 = 1;  -2-  (1 * 10 + 2) % 4 = 0;

    -3-  (0 * 10 + 3) % 4 = 3;  -4-  得到最终结果3

 

    也就是模拟了除法竖式的过程

【练习题】

  • 题目链接:http://arena.acmclub.com/problem.php?id=1086

    代码:

 1 #include<cstdio>

 2 #include<cstring>

 3 const int MAXN = 1000;

 4 int mod(char str[],int num)

 5 {

 6     int number[MAXN],i,d = 0;

 7     int len = strlen(str);

 8     //将字符串数组转化为数字数组

 9     for(i = 0;i < len;i++)

10         number[i]=str[i]-'0';

11     int remainder=0;

12     for(i = 0;i < len;i++)

13     {

14         remainder=(remainder * 10 + number[i]) % num;

15     }

16     return remainder;

17 }

18 int main(){

19     char A[MAXN];

20     int B;

21     //'~'取反符号,当输入值不符合要求时停止

22     //while(~scanf("%s %d",A,&B)){

23 

24     //判断有无结尾符结束

25     //while(scanf("%s %d",A,&B) != EOF){

26 

27     //如果两个参数均被读入则返回参数个数

28     while(scanf("%s %d",A,&B) == 2){

29         printf("%d\n",mod(A,B));    

30     }    

31     return 0;

32 }

  

  • 下面这种方法是运用到了C++ 的大数类,大数模板
    C++ 大数模板 链接:http://www.cnblogs.com/zhengbin/p/4368182.html

    代码:

 1 #include<iostream>

 2 #include<cstring>

 3 using namespace std;

 4 const int MAXN = 9999;

 5 const int DLEN = 4;

 6 char str[1010];

 7 int modd;

 8 class BigNum{

 9     private:

10         int a[1010];

11         int len;

12     public:

13         BigNum(){len = 1;memset(a,0,sizeof(a));}

14         BigNum(const char*);

15         int operator %(const int &)const;

16 };

17 BigNum::BigNum(const char*s)     //将一个字符串类型的变量转化为大数

18 {

19     int t,k,index,l,i;

20     memset(a,0,sizeof(a));

21     l=strlen(s);   

22     len=l/DLEN;

23     if(l%DLEN)

24         len++;

25     index=0;

26     for(i=l-1;i>=0;i-=DLEN)

27     {

28         t=0;

29         k=i-DLEN+1;

30         if(k<0)

31             k=0;

32         for(int j=k;j<=i;j++)

33             t=t*10+s[j]-'0';

34         a[index++]=t;

35     }

36 }

37 int BigNum::operator %(const int & b) const{    //大数对一个int类型的变量进行取模运算    

38     int i,d=0;

39     for (i = len-1; i>=0; i--)

40     {

41         d = ((d * (MAXN+1))% b + a[i])% b;  

42     }

43     return d;

44 }

45 int main(){

46     while(~scanf("%s %d",str,&modd)){

47         BigNum big(str);

48         cout << big % modd << endl;

49     }

50     return 0;

51 }

 

你可能感兴趣的:(code)