5.6大整数运算2

a+b完整代码

#include <cstdio>
#include <cstring> 
 
struct bign{			//结构体 
	
	int d[10000];
	int len;
	bign(){
		memset(d,0,sizeof(d));
		len =0;
	}
}; 

bign change(char str[]){	//把整数化成bign 
	bign a;
	a.len = strlen(str);
	for(int i=0; i<a.len; i++){
		a.d[i] = str[a.len-i-1]-'0';
	}
	
	return a;
}

	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;
	} 

void prin(bign a){			//打印 
	
	for(int i=a.len-1; i>=0 ; i--){
		
		printf("%d",a.d[i])	;
		
	}
	printf("\n"); 
}

bool cmp(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; //相等 
	} 
}
 
int main(){

	char str1[1000] , str2[1000]; 
	while(scanf("%s%s",str1,str2) != EOF ){
		bign a = change(str1);	
		bign b = change(str2);
		prin(add(a,b));
	
	} 

	return 0;
}

习题,求N的阶乘(N<=1000)

用简单的int存储不了,应用高精度乘法乘低精度方法做

#include <cstdio>
#include <cstring>
//求N的阶乘(n<=1000)

struct bign{		//建一个结构体 
	int d[100000];		//若只有10000,则会显示答案错误 
	int len;
	
	bign(){
		memset(d,0,sizeof(d));
		len =0;
	}		
};

bign changeInt(int n){		//将int型化成大整数,用数组存
	bign a;
	while(n !=0){
		a.d[a.len++] = n%10;
		n = n/10;
	}
	return a;
}

bign multi(bign a, int b){

	bign  c;
	int carry =0;
	for(int i=0; i<a.len; i++){
		
		int temp = a.d[i] * b +carry;
		c.d[c.len++] = temp %10;
		carry = temp /10;
	}
	while(carry != 0 ) {
		c.d[c.len++] = carry % 10;
		carry = carry /10;
	}
	
	return c;
}



void prin(bign a){
	for(int i = a.len-1 ; i>=0 ;i --){
		printf("%d" , a.d[i]); 
	} 
	printf("\n");
}


int main(){

	int n;
	while(scanf("%d" , &n) != EOF ){		
		bign x = changeInt(n);
		if( n == 0) 	
			printf("1\n");
		else{
			for(int i=1; i<n; i++)
				x = multi(x,i);
			prin(x);
		}				
	}
	return 0;
}
  • 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、付费专栏及课程。

余额充值