CH5非负整数+ - * / (整除) 运算

时隔一年多,整除还是写的磕磕巴巴的

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
using std::string;
using std::max;
const int maxn = 1000;
class bign
{
public:
	int len, s[maxn];
	bign()
	{
		memset(s, 0, sizeof(s));
		len = 1;
	}
	bign operator = (const char * num)
	{
		memset(s, 0, sizeof(s));
		len = strlen(num);
		for(int i = 0; i < len; ++i)
			s[i] = num[len-1-i] - '0';
		return *this;
	}
	bign operator = (int num)
	{
		char s[maxn];
		sprintf(s, "%d", num);
		*this = s;
		return *this;
	}
	bign(const char* num) 
	{
		*this = num;
	}
	bign(int num)
	{
		*this = num;
	}
	string str() const
	{
		string res = "";
		for(int i = 0; i < len; ++i)
			res = (char)(s[i]+'0') + res;
		if(res == "")
			res = "0";
		return res;
	}
	bign operator + (const bign& b) const
	{
		bign c;
		c.len = 0;
		int g = 0;
		for(int i = 0; i < max(len, b.len)+1; ++i)
		{
			int x = g+s[i]+b.s[i];
			c.s[c.len++] = x%10;
			g = x/10;
		}
		if(!c.s[c.len-1])
			--c.len;
		return c;
	}
	bign operator - (const bign& b) const
	{
		bign c;
		c.len = 0;
		int g = 0;
		//suppose *this => b
		for(int i = 0; i < len; ++i)
		{
			if(s[i] - b.s[i] + g < 0)
			{
				c.s[c.len++] = s[i] - b.s[i] + g + 10;
				g = -1;
			}
			else
			{
				c.s[c.len++] = s[i] - b.s[i] + g;
				g = 0;
			}
		}
		for(int i = c.len-1; i >= 0; --i)
		{
			if(!c.s[i])
				c.len--;
			else 
				break;
		}
		if(!c.len)
			c.len = 1;  //when c.s is all 0
		return c;
	}
	bign operator * (const bign& b) const
	{
		bign c;
		c.len = 0;
		for(int pos = 0; pos < maxn; ++pos)
		{
			//pay attention to where i starts from
			for(int i = max(pos-len+1, 0); (pos-i >=0) && (i < b.len); ++i)  
			{
				c.s[pos] += s[pos-i] * b.s[i];
				//if(s[pos-i] * b.s[i])
						//printf("s b.s (%d, %d): %d %d\n", pos-i, i, s[pos-i], b.s[i]);
			}
			c.s[pos+1] += c.s[pos]/10;
			c.s[pos] %= 10;
			//if(c.s[pos+1] || c.s[pos])
			//	printf("c.s.pos+1 c.s.pos (%d, %d): %d %d\n", pos+1, pos, c.s[pos+1], c.s[pos]);

		}
		int start;
		for(start = maxn-1; start >= 0 && !c.s[start]; --start);
	    if(start == -1)
			c.len = 1;  //all zero
		else
			c.len = start+1;
		return c;
	}
	void print()
	{
		string str = this->str();
		printf("%s,len:%d\n", str.c_str(), this->len);
	}
	bool operator < (const bign & b) const
	{
		if(len != b.len) return len < b.len;
		for(int i = len-1; i >= 0; --i)
		{
			if(s[i] != b.s[i]) return s[i] < b.s[i];
		}
		return false;
	}
	bool operator > (const bign & b) const
	{
		return (b < *this);
	}
	bool operator <= (const bign & b) const
	{
		return !(*this > b);
	}
	bign operator / (const bign & divisor) const
	{
		//interger division
		bign quotient;
		bign remainder = 0;
		for(int pos = len-1; pos >= 0; pos--)
		{
			remainder = remainder * bign(10) + s[pos];
			int digit;
			for(digit = 0; digit < 10; ++digit)
			{
				if(bign(digit) * divisor <= remainder && bign(digit+1) * divisor > remainder)
				{
					break;
				}
			}
			quotient.s[pos] = digit;
			remainder = remainder - bign(digit) * divisor;
		}
		int start;
		for(start = maxn-1; start >= 0 && !quotient.s[start]; --start);
	    if(start == -1)
			quotient.len = 1;  //all zero
		else
			quotient.len = start+1;
		return quotient;
	}
};
int main()
{
	char num1[100];
	char num2[100];
	bign op1, op2, op3;
	printf("test add:\n");
	while(scanf("%s %s", num1, num2) == 2)
	{
		op1 = num1, op2 = num2;
		op3 = op1 + op2;
		op3.print();
	}
	printf("test minus:\n");
	while(scanf("%s %s", num1, num2) == 2)
	{
		op1 = num1, op2 = num2;
		op3 = op1 - op2;
		op3.print();
	}
	printf("test multiple:\n");
	while(scanf("%s %s", num1, num2) == 2)
	{
		op1 = num1, op2 = num2;
		op3 = op1 * op2;
		op3.print();
	}
	printf("test divide:\n");
	while(scanf("%s %s", num1, num2) == 2)
	{
		op1 = num1, op2 = num2;
		op3 = op1 / op2;
		op3.print();
	}
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值