整数高精度计算

加法:

#include <iostream>
#include <cstring>
using namespace std;
int main(){
	char aa[100],bb[100];int a[100],b[100],c[100];
	int lena,lenb,lenc,i,x;
	memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));
	gets(aa);gets(bb);
	lena = strlen(aa);lenb = strlen(bb);
	for(i=0;i<lena;i++)a[lena-i]=aa[i]-48;
	for(i=0;i<lenb;i++)b[lenb-i]=bb[i]-48;	
	lenc=1;x=0;
	while(lenc<=lena || lenc<=lenb){
		c[lenc]=a[lenc]+b[lenc]+x;
		x=c[lenc]/10;		
		c[lenc]%=10;
		lenc++;
	}
	c[lenc]=x;
	if(c[lenc]==0)lenc--;
	for(i=lenc;i>=1;i--)cout<<c[i];
	cout<<endl;
	
	return 0;
}

总结:
1、字符串输入,逆序存储;
2、逐位相加,保留余数,向前进位;


减法:

#include <iostream>
#include <cstring>
using namespace std;
int main(){
	int a[256],b[256],c[256];
	char t[256],t1[256],t2[256];
	int i,lena,lenb,lenc;
	memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));
	gets(t1);gets(t2);
	if((strlen(t1)<strlen(t2)) || (strlen(t1)==strlen(t2) && strcmp(t1,t2)<0)){
		strcpy(t,t1);
		strcpy(t1,t2);
		strcpy(t2,t);
		cout<<"-";
	}
	lena=strlen(t1);lenb=strlen(t2);
	for(i=0;i<lena;i++)a[lena-i]=t1[i]-48;
	for(i=0;i<lenb;i++)b[lenb-i]=t2[i]-48;
	i=1;
	while(i<=lena || i<=lenb){
		if(a[i]<b[i]){
			a[i]+=10;
			a[i+1]--;
		}
		c[i]=a[i]-b[i];
		i++;
	}
	lenc=i;
	while(c[lenc]==0 && lenc>1)lenc--;
	for(i=lenc;i>=1;i--)cout<<c[i];
	cout<<endl;
	
	return 0;
}

总结:

1、字符输入,逆序存储;

2、保证被减数大于减数;

3、去除高位0;


乘法:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main(){
	char t1[256],t2[256];int a[256],b[256],c[256];
	int x,i,j;int lena,lenb,lenc;
	memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c)); 
	gets(t1);gets(t2);
	lena=strlen(t1);lenb=strlen(t2);
	for(i=0;i<lena;i++)a[lena-i]=t1[i]-48;
	for(i=0;i<lenb;i++)b[lenb-i]=t2[i]-48;
	for(i=1;i<=lena;i++){
		x=0;
		for(j=1;j<=lenb;j++){
			c[i+j-1]=a[i]*b[j]+x+c[i+j-1];
			x=c[i+j-1]/10;
			c[i+j-1]%=10;
		}
		c[i+lenb]=x;
	}
	lenc=lena+lenb;
	while(c[lenc]==0 && lenc>1)lenc--;
	for(i=lenc;i>=1;i--)cout<<c[i];
	cout<<endl;
	
	return 0;
}

c[i+j-1]=a[i]*b[j]+x+c[i+j-1]


除法(高精除低精)

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main(){
	char t[256];int a[256],c[256];
	int b,lena,lenc,i,x;
	memset(a,0,sizeof(a));memset(c,0,sizeof(c));
	gets(t);cin>>b;
	lena=strlen(t);
	for(i=0;i<lena;i++)a[i+1]=t[i]-48;//正序存储,从1开始 
	x=0;
	for(i=1;i<=lena;i++){
		c[i]=(x*10+a[i])/b;
		x=(x*10+a[i])%b;
	}
	lenc=1;
	while(c[lenc]==0 && lenc<lena)lenc++;
	for(i=lenc;i<=lena;i++)cout<<c[i];
	cout<<endl; 
	
	return 0;	
}


除法(高精除高精)

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int compare(int a[],int b[]);
void jian(int a[],int b[]);
int a[256],b[256],c[256];
int main(){
	char s1[256],s2[256];int t[256];int i,j;
	memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));
	gets(s1);gets(s2);
	a[0]=strlen(s1);b[0]=strlen(s2);c[0]=a[0]-b[0]+1;
	for(i=0;i<a[0];i++)a[a[0]-i]=s1[i]-48;
	for(i=0;i<b[0];i++)b[b[0]-i]=s2[i]-48;
	for(i=c[0];i>0;i--){
		memset(t,0,sizeof(t));
		for(j=1;j<=b[0];j++)t[j+i-1]=b[j];
		t[0]=b[0]+i-1;
		while(compare(a,t)>=0){c[i]++;jian(a,t);}
	}
	while(c[0]>0 && c[c[0]]==0)c[0]--;
	if(c[0]==0){
		cout<<0<<endl;
	}else{
		for(i=c[0];i>=1;i--)cout<<c[i];
		cout<<endl;
	}
	return 0;	
}
int compare(int a[],int b[]){
	int i;
	if(a[0]>b[0])return 1;
	if(a[0]<b[0])return -1;
	for(i=a[0];i>0;i--){
		if(a[i]>b[i])return 1;
		if(a[i]<b[i])return -1;
	}
	return 0;
}
void jian(int a[],int b[]){
	int i,flag;
	flag = compare(a,b);
	if(flag==0){a[0]=0;return;}
	if(flag==1){
		for(i=1;i<=a[0];i++){
			if(a[i]<b[i]){a[i+1]--;a[i]+=10;}
			a[i]=a[i]-b[i];
		}
	}
	while(a[0]>0 && a[a[0]]==0)a[0]--;
	return;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
密码学分为两类密码:对称密码和非对称密码。对称密码主要用于数据的加/解密,而非对称密码则主要用于认证、数字签名等场合。非对称密码在加密和解密时,是把加密的数据当作一个大的正整数来处理,这样就涉及到大整数的加、减、乘、除和指数运算等,同时,还需要对大整数进行输出。请采用相应的数据结构实现大整数的加、减、乘、除和指数运算,以及大整数的输入和输出。 【基本要求】 1.要求采用链表来实现大整数的存储和运算,不允许使用标准模板类的链表类(list)和函数。 同时要求可以从键盘输入大整数,也可以文件输入大整数,大整数可以输出至显示器,也可以输出至文件。大整数的存储、运算和显示,可以同时支持二进制和十进制,但至少要支持十进制。大整数输出显示时,必须能清楚地表达出整数的位数。测试时,各种情况都需要测试,并附上测试截图;要求测试例子要比较详尽,各种极限情况也要考虑到,测试的输出信息要详细易懂,表明各个功能的执行正确。 2.要求大整数的长度可以不受限制,即大整数的十进制位数不受限制,可以为十几位的整数,也可以为500多位的整数,甚至更长;大整数的运算和显示时,只需要考虑正的大整数。如果可能的话,请以秒为单位显示每次大整数运算的时间。 3.要求采用类的设计思路,不允许出现类以外的函数定义,但允许友元函数。主函数中只能出现类的成员函数的调用,不允许出现对其它函数的调用。 4.要求采用多文件方式:.h文件存储类的声明,.cpp文件存储类的实现,主函数main存储在另外一个单独的cpp文件中。如果采用类模板,则类的声明和实现都放在.h文件中。 5.不强制要求采用类模板,也不要求采用可视化窗口;要求源程序中有相应注释。 6.要求采用Visual C++ 6.0及以上版本进行调试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值