简单的大正整数计算器

在同一个程序中实现大整数的+ _ * /运算(200位以内)

#include<stdio.h>
#include<string.h>
#define ML 220		//宏定义,定义数组的长度 
char s1[ML];		//定义全局变量 
char s2[ML];
int a[ML];
int b[ML];

//----------------------------加-------------------------------------//
int ADD(int *p1,int *p2,int l1,int l2){
	int add[ML],i,j;
	memset(add,0,sizeof(add));  //对add数组进行初始赋值0 
	int a=l1;
	if(l1<l2) a=l2;
	for(i=a-1,j=0;i>=0;i--){  //从两个数的个位开始相加,之和存入add数组中,从个位开始 
		add[j]=add[j]+p1[i]+p2[i];
		if(add[j]>=10){   //如果该位两数字相加大于10,则add相应位减10,下一位加1 
			add[j]-=10;
			add[j+1]++;
		}
		j++;
	}
	if(add[j]) printf("%d",add[j]);   //判断两数和的第j位(即最高位)是否为0,为0不输出,否则,输出 
	for(;j>0;j--)
		printf("%d",add[j-1]);     //从最高位往低位输出结果 
	printf("\n");
}
//----------------------------减-------------------------------------//
int SUB(int *p1,int *p2,int l1,int l2){
	int sub[ML],i,j;
	memset(sub,0,sizeof(sub));  //对sub数组进行初始赋值0 
	if(l2>l1){						//判断减数与被减数的位数大小,若被减数位数小于减数,则先按照长数组减短数组计算,即先计算减数减去被减数 
		for(i=l2-1,j=0;i>=0;i--,j++){
			sub[j]=sub[j]+p2[i]-p1[i];
			if(sub[j]<0){			//若该位不够减,即此数小于0,则向高一位借1 
				sub[j]+=10;
				sub[j+1]--;
			}
		}
	}
	else {
		for(i=l1-1,j=0;i>=0;i--,j++){
			sub[j]=sub[j]+p1[i]-p2[i];
			if(sub[j]<0){
				if(i){			//判断i是否为0,若为0,则sub[j]小于0时不向高位借1,否则借1 
					sub[j]+=10;
					sub[j+1]--;
				}
			}
		}
	}
	if(l2>l1) printf("-");			//若被减数的位数比减数的小,则输出负号(-) 
	if(sub[j]) printf("%d",sub[j]);		//判断sub[j]是否为0,为0不输出,否则,输出 
	for(;j>0;j--)
		printf("%d",sub[j-1]);		//从高位往低位输出结果 
	printf("\n");
}
//----------------------------乘-------------------------------------//
int MUL(int *p1,int *p2,int l1,int l2){
	int mul[ML*2],i,j,k;
	memset(mul,0,sizeof(mul));		//对mul数组进行初始赋值0 
	for(i=l2-1;i>=0;i--){		//先对每一位上的数字进行乘法运算,存入相应的位置 
		for(j=l1-1,k=l2-i-1;j>=0;j--,k++){
			mul[k]=mul[k]+p1[j]*p2[i];
		}
	}
	for(i=0;i<k;i++){		//对乘法运算过后的数组逐位处理进位 
		if(mul[i]>=10){
			mul[i+1]+=mul[i]/10;
			mul[i]%=10;
		}
	}
	if(mul[k]) printf("%d",mul[k]);		//判断mul[k]是否为0,为0不输出,否则,输出 
	for(;k>0;k--)
		printf("%d",mul[k-1]);		//从高位往低位输出结果 
	printf("\n");
}
//----------------------------除-------------------------------------//
int DIV(int *p1,int *p2,int l1,int l2){
	int div[ML],i,j,k;
	memset(div,0,sizeof(div));		//对div数组进行初始赋值0 
	int x=0;
	for(i=0;i<l2;i++){		//统计除数中0的个数 
		if(p2[i]==0)
			x++;
	}
	if(x==l2) printf("Your input is wrong!\n");		//若除数中0的个数与除数的长度相等,即除数为0,输出提示”输入有误“ 
	else if(l1>l2){				//判断除数与被除数的位数大小,若被除数位数大,则累减求商 
		int ntime=l1-l2;		//判断除数与被除数的位数差,也即是商的位数-1 
		for(i=l1-1;i>=ntime;i--)		//将除数的位数扩大至与被除数的位数相同,即,在除数尾部添加0至与被除数位数相等 
			p2[i]=p2[i-ntime];
		for(;i>=0;i--)
			p2[i]=0;
		for(i=0;i<=ntime;i++){
			while(1){					//求商,也即是采用累减的方法计算商的每一位数字 
				for(j=l1-i-1,k=l1-1;j>=0&&k>=i;j--,k--){
					p1[j]-=p2[k];
					if(p1[j]<0){
						if(j){
							p1[j]+=10;
							p1[j-1]--;
						}
					}
				}
				if(p1[0]>=0) div[i]++;		//若被除数的最高位大于等于0,则该位的商+1 
				else break;			//累减至被除数的最高位小于0,得出每一位的商的数 
			}
		}
		for(i=ntime;i>=0;i--) if(div[i]) break;  //过滤0 
		for(;i>=0;i--) printf("%d",div[i]);  //输出商 
	//	for(i=0;i<=ntime;i++)		//从高位往低位输出结果 
	//		printf("%d",div[i]);   输出相反了。。。。。。 
		printf("\n");
	}
	else if(l1==l2&&p1[0]>=p2[0]){		//若除数与被除数位数相等,且被除数的最高位大于等于除数的,再次利用累减方法求商 
		int m=0;		//除数与被除数位数相等,则其商是个一位数 
		while(1){
			for(j=l1-1,k=l2-1;j>=0&&k>=0;j--,k--){
				p1[j]-=p2[k];
				if(p1[j]<0){
					if(j){
						p1[j]+=10;
						p1[j-1]--;
					}
				}
			}
			if(p1[0]>=0) m++;
			else break;
		}
		printf("%d\n",m);		//输出商 
	}
	else printf("0\n");		//若除数位数大于被除数位数,或,其位数相等且除数最高位小于被除数的,则输出0 
} 
//--------------------------主函数-----------------------------------// 
int main()
{
	int i,j,k;
	char s;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	scanf("%s %c %s",s1,&s,s2);
	int l1=strlen(s1);
	for(i=l1-1,j=l1-1;i>=0;i--)		//将字符串s1内的数字字符转化成数字存入a数组中 
		a[j--]=s1[i]-'0';
	int l2=strlen(s2);
	for(i=l2-1,j=l2-1;i>=0;i--)		//将字符串s2内的数字字符转化成数字存入b数组中 
		b[j--]=s2[i]-'0';
	 switch(s){			//判断需要进行的运算:’+‘、’-‘,’*‘,’/‘? 
	 	case '+':ADD(a,b,l1,l2);break;
	 	case '-':SUB(a,b,l1,l2);break;
	 	case '*':MUL(a,b,l1,l2);break;
	 	case '/':DIV(a,b,l1,l2);break;
	 }
	return 0;
}



 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于200整数超出了C++内置数据类型的范围,我们需要使用字符串来表示这个大正整数。具体实现如下: ```c++ #include <iostream> #include <cstring> using namespace std; class LPInteger { private: char digits[201]; public: LPInteger() { memset(digits, '0', sizeof(digits)); } LPInteger(const char* str) { memset(digits, '0', sizeof(digits)); int len = strlen(str); for (int i = 0; i < len; i++) { digits[200 - len + i] = str[i]; // 从高到低存储 } } LPInteger operator+(const LPInteger& other) const { LPInteger result; int carry = 0; for (int i = 200; i >= 0; i--) { // 从低到高相加 int sum = digits[i] - '0' + other.digits[i] - '0' + carry; result.digits[i] = sum % 10 + '0'; carry = sum / 10; } return result; } void print() const { int i = 0; while (digits[i] == '0' && i < 200) i++; // 忽略前导0 cout << (i == 200 ? "0" : &digits[i]) << endl; // 如果是0,输出一个0,否则输出去掉前导0的数字串 } int length() const { int i = 0; while (digits[i] == '0' && i < 200) i++; // 忽略前导0 return 200 - i + 1; // 200减去去掉前导0的数字串的起始置再加1就是数 } }; int main() { char a[201], b[201]; cin >> a >> b; LPInteger x(a), y(b); (x + y).print(); cout << (x + y).length() << endl; return 0; } ``` 在这个实现中,我们使用一个长度为201的字符数组来存储大正整数。为了方便运算,我们把这个数组看成一个长度为200的数字串,从高到低存储。这样,我们就可以方便地实现加法运算。为了输出这个大正整数数,我们还实现了print和length两个成员函数,其中print用来输出去掉前导0的数字串,length用来计算数。最后,我们在主函数中输入两个大正整数,并输出它们的和以及数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值