大数四则运算c

#define _CRT_SECURE_NO_DEPRECATE
#include
   
   
    
    
#include
    
    
     
     
#include
     
     
      
      
#include
      
      
       
       
#define size 210

using namespace std;

void reverse(int a[size * 2])//反向
{
	for (int i = 1, j = a[0], t; i < j; i++, j--)
		t = a[i], a[i] = a[j], a[j] = t;
}
void sove(int c[size * 2]) //加乘的进位
{
	int i;
	for (i = 1; i <= c[0]; i++)
		c[i + 1] += c[i] / 10, c[i] = c[i] % 10;//满十 高位进位,低位取余、乘法不会超过i+j位数
	c[0] = c[c[0] + 1] ? c[0] + 1 : c[0];//即不会超过c数组最后一位加一
	reverse(c);
}
int bigcmp(int ca[size], int cb[size])//比较大小
{
	int i, a[size], b[size];
	for (i = 0; i
       
       
         b[0] ? a[0] : b[0]; i > 0; i--) { if (a[i] > b[i]) return 1; if (a[i] < b[i]) return -1; } return 0; } void reduce(int a[size], int b[200], int c[size * 2])//减 { int i; for (i = 1; i <= a[0]; i++) { if (a[i] < b[i]) a[i + 1]--, a[i] += 10;//笔算时的算法 c[i] = a[i] - b[i]; } for (i = a[0]; c[i] == 0; i--);//找到非零位 c[0] = i; reverse(c); } void bigplus(int ca[size], int cb[size], int c[size * 2])//加 { int i, j, a[size], b[size]; for (i = 0; i 
        
          b[0] ? a[0] : b[0]); for (i = 1; i <= n; i++) c[i] += a[i] + b[i]; c[0] = n; sove(c); } void bigmul(int ca[size], int cb[200], int c[size * 2])//乘 { int i, j, a[size], b[size]; for (i = 0; i < size; i++) a[i] = ca[i], b[i] = cb[i]; reverse(a); reverse(b); for (i = 1; i <= a[0]; i++) for (j = 1; j <= b[0]; j++) c[i + j - 1] += a[i] * b[j];//从1开始,啊a[i]*b[j]=c[i+j-1]位的值 c[0] = a[0] + b[0] - 1;//不算进位最后一位 sove(c); } void bigreduce(int ca[size], int cb[200], int c[size * 2])//减 { int i, j, a[size], b[size]; for (i = 0; i < size; i++) a[i] = ca[i], b[i] = cb[i]; reverse(a); reverse(b); int flag = bigcmp(ca, cb); if (flag == 1)//比较大小再相减,减法是大的减小的 reduce(a, b, c); else if (flag == -1) { reduce(b, a, c); c[c[0] + 1] = -1;//最后一位加1表相减时的正负 } else c[1] = 0, c[0] = 1; } void bigdivide(int ca[size], int cb[200], int c[size * 2], int pre)//除 { int i, j, a[size], b[size]; for (i = 0; i < size; i++) a[i] = ca[i], b[i] = cb[i]; int pr = 1, la = 0,flag=0; int aa[size] = { 0 }, cc[size] = { 0 };//按照笔算的方法,用来相除子列的值和商 while (pr <= pre+1) { aa[++aa[0]] = a[++la]; if (la == a[0] + 1) { c[pr++] = -2; flag = 1; }//表示小数点 while (bigcmp(aa, b) != -1) { flag = 1; bigreduce(aa, b, cc);//一次减掉一个b c[pr]++; memset(aa, 0, sizeof(aa)); for (i = 0; i <= cc[0]; i++)//子列被除数更新 aa[i] = cc[i]; memset(cc, 0, sizeof(cc)); } if (flag) pr++; } c[0] = pre; } int main(void) { int i, c[size * 2], a[size], b[size]; char ch, cc;//笔算的方法 while (1) { memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); for (i = 0; isdigit(cc = getchar()); a[++i] = cc - '0'); ch = cc; a[0] = i;//a[0]表数的长度 for (i = 0; isdigit(cc = getchar()); b[++i] = cc - '0'); b[0] = i; if (ch == '+') bigplus(a, b, c); if (ch == '-') bigreduce(a, b, c); if (ch == '*') bigmul(a, b, c); if (ch == '/') bigdivide(a, b, c, 10); if (c[c[0] + 1] == -1) printf("-"); for (i = 1; i <= c[0]; i++) if (c[i] == -2) cout << '.'; else cout << c[i]; cout << endl; } return 0; } /* 789989987+78785965465425 4515-15412 25983426/23446 12/24 132564*74848 0/5 1+1 0+1 0+9 99*99 99/99 0+0 0/0 */ 
         
       
      
      
     
     
    
    
   
   
//写这个长度的代码,居然就花了一天,要改进呀,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值