大数取模运算

问题分析:
    (1)大数存储:由于x的位数最大为400位,我们不能用现有的int,long,long long,double等数据类型进行存储。一般存储大数的方法是用一个字符串来表示。
    (2)取模运算:模拟手算竖式的方法。用x从高到低的每一位加上前一位余数*10来对bi进行%,最后得到的结果就是x%bi的结果。

    利用到公式:(a+b) mod (n) = (a mod n) + (b mod n) mod (n);

  1 %m   =  1 
        12 % m  = ( 1 * 10 + 2 ) % m = ( 1 % m * 10 + 2 ) % m 
        123 % m = ( 12 * 10 + 3) % m = ( 12 % m * 10 + 3) % m 

        ...
       12345678901234567890 % m =(( 1 % m * 10 + 2 ) % m * 10 + 3 ) % m...

int divMod(char* ch,int num)
{
	int s = 0;
	for(int i=0;ch[i]!='\0';i++)
		s = (s*10+ch[i]-'0')%num;
	
	return s;
}

例题:soj 1020 Big Num
题目大意:
给出n个整数b1,b2,...,bn,和一个大整数x,求x对每个数bi取模的结果
        n<=100, 1<bi<=1000,x的长度不超过400
# include <iostream>
# include <cstdio>
# include <cstring>

using namespace std;

int divMod(char* ch,int num)
{
	int s = 0;
	for(int i=0;ch[i]!='\0';i++)
		s = (s*10+ch[i]-'0')%num;
	
	return s;
}

int main()
{
	int test,num,m;
	int list[500];
	cin >> test;
	while(test--)
	{	
		cin >> num;
		for(int i=0;i<num;i++)
			cin >> list[i];
		char ch[500];
		
		cin >> ch;
		for(int i=0;i<num;i++)
			list[i] = divMod(ch,list[i]);
		
		cout << '(';
		for(int i=0;i<num-1;i++)
			cout << list[i] << ',';
		
		cout << list[num-1] <<  ')'  << endl;
	}
	return 0;
}

参考资料:http://blog.csdn.net/chocolate_22/article/details/6457906



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页