zoukankan      html  css  js  c++  java
  • 大整数运算模板总结

    大整数运算模板总结。

    大整数结构体表示

    整型数组从低位到高位顺序存储每一位数字,另外需要存储数字的长度。

    struct bign
    {
    	int d[1000];
    	int len;
    	bign(){
    		memset(d, 0, sizeof(d));
    		len = 0;
    	}
    };
    

    大整数输入

    一般通过字符串输入。

    bign Change(string str)//输入字符串转大整数
    {
    	bign a;
    	a.len = str.length();
    	for (int i = 0; i < a.len; i++)
    	{
    		a.d[i] = str[a.len - i - 1] - '0';//倒着赋值
    	}
    	return a;
    }
    

    大整数比较

    int compare(bign a, bign b)
    {
    	if (a.len > b.len)return 1;
    	else if (a.len < b.len)return -1;
    	else {
    		for (int i = a.len - 1; i >= 0; i--)//从高位往低位比较
    		{
    			if (a.d[i] > b.d[i])return 1;
    			else if (a.d[i] < b.d[i])return -1;
    		}
    		return 0;//相等
    	}
    }
    

    大整数加法

    每一位顺次相加并进位。

    bign add(bign a, bign b)
    {
    	bign c;
    	int carry = 0;//进位
    	for (int i = 0; i < a.len || i < b.len; i++)
    	{
    		int temp = a.d[i] + b.d[i] + carry;
    		c.d[c.len++] = temp % 10;
    		carry = temp / 10;
    	}
    	if (carry != 0)
    		c.d[c.len++] = carry;
    	return c;
    }
    

    大整数减法

    从低位开始相减,不够则向高位借位,最后结果可能包含多余的高位0,需要消去。

    调用sub函数的前提是a大于b,所以先判断两个大整数的大小关系,如果被减数比减数小则先输出负号然后将两数调换再调用sub函数。

    bign sub(bign a, bign b)
    {
    	bign c;
    	for (int i = 0; i < a.len || i < b.len; i++)
    	{
    		if (a.d[i] < b.d[i]) {//向高位借位
    			a.d[i + 1]--;
    			a.d[i] += 10;
    		}
    		c.d[c.len++] = a.d[i] - b.d[i];
    	}
    	while (c.len - 1 >= 1 && c.d[c.len - 1] == 0)
    	{
    		c.len--;
    	}
    	return c;
    }
    

    大整数乘法

    按乘法原理将a的每一位与b的每一位相乘加到c的对应位上,最后处理进位和高位0。

    bign mul(bign a, bign b)
    {
    	bign c;
    	c.len = a.len + b.len;
    	for (int i = 0; i < a.len; i++)
    	{
    		for (int j = 0; j < b.len; j++)
    		{
    			c.d[i + j] += a.d[i] * b.d[j];
    		}
    	}
    	for (int i = 0; i < c.len; i++)
    	{
    		if (c.d[i] > 9) {
    			c.d[i + 1] += c.d[i] / 10;
    			c.d[i] %= 10;
    		}
    	}
    	while (c.len - 1 >= 1 && c.d[c.len - 1] == 0)
    	{
    		c.len--;
    	}
    	return c;
    }
    

    大整数除法

    举个例子,2532 除以 17 。

    从高位开始一位一位取出被除数的数字,先是 2,判断是否小于 17,小于则结果这一位为 0(千位)。

    再取一位,25, 大于17,那就看能减多少个 17,减1次之后发现比17小了,所以结果百位是1,减剩下的是8。

    重复这个过程,取一位,83, 能减4个17,所以结果十位是4,剩15.

    再取一位, 152, 能减8个17,所以结果个位为8,结束。

    答案为 0148 ,处理高位0即为 148

    bign Divide(bign a,bign b)
    {
    	bign x, y;
    	for (int i = a.len-1; i >= 0; i--)
    	{
    		y.d[y.len++] = a.d[i];
    		reverse(y.d, y.d + y.len);   //取数之后需要反转
    		while (compare(y,b)!=-1)
    		{
    			y = sub(y, b);
    			++x.d[i];
    		}
    		reverse(y.d, y.d + y.len);   
    		x.len = a.len;
    	}
    	while (x.len - 1 >= 1 && x.d[x.len - 1] == 0)
    	{
    		x.len--;
    	}
    	return x;
    }
    
  • 相关阅读:
    CQUOJ 10819 MUH and House of Cards
    CQUOJ 9920 Ladder
    CQUOJ 9906 Little Girl and Maximum XOR
    CQUOJ 10672 Kolya and Tandem Repeat
    CQUOJ 9711 Primes on Interval
    指针试水
    Another test
    Test
    二分图匹配的重要概念以及匈牙利算法
    二分图最大匹配
  • 原文地址:https://www.cnblogs.com/LiveForGame/p/12032237.html
Copyright © 2011-2022 走看看