大数运算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数运算相关的知识,希望对你有一定的参考价值。

【0】

大数加法和大数乘法都需要诸位运算?

大数减法呢,是变成负数诸位运算,还是模仿补码,哪个更容易?

大数除法,则是模拟N个大数减法。

大数取余,则是诸位取余。

大数乘法,累加过程中,涉及到大数加法和大数取余,

大数除法,递减过程中,涉及到大数减法和大数乘法。

大数阶乘呢?

【1】

http://acm.hdu.edu.cn/showproblem.php?pid=1002

待修改

//HDU 1002 
#include<stdio.h>
#include<string.h>
int main() {
	int i,j=0,n,m,len1,len2,flag;
	char st1[1001],st2[1001],s3[1003]= {0},s1[1001]= {0},s2[1001]= {0};
	scanf("%d",&n);
	while(j<=n-1) {
		flag=0;
		
		//预处理 
		memset(s1,0,sizeof(s1));
		memset(s2,0,sizeof(s2));
		memset(s3,0,sizeof(s3));
		scanf("%s",st1);
		scanf("%s",st2);
		printf("Case %d:\n",j+1);
		printf("%s + %s = ",st1,st2);
		len1=strlen(st1);
		len2=strlen(st2);
		
		if(len1==1&&len2==1&&st1[0]==48&&st2[0]==48) {
			printf("0");//特殊情况避免下文死循环 
		} else {
			//逆序,保证诸位相加时,是从个位开始的 
			for(i=0; i<=len1-1; i++) {
				s1[len1-i-1]=st1[i]-48;
			}
			for(i=0; i<=len2-1; i++) {
				s2[len2-i-1]=st2[i]-48;
			}
			//诸位相加直到两个数高位都是零 
			for(i=0; i<len1||i<len2; i++) {
				s3[i]=s1[i]+s2[i];
			}
			for(i=0; i<=1003; i++) {//似乎也可以统计位数改进 
				s3[i+1]+=(s3[i]/10);//进位 
				s3[i]%=10;//保留结果
				//每一位都涉及到除法和取余是否太浪费 
			}
			for(i=0; i<=1003; i++) {//从最开始的地方打印 ,而非个位或者最高位 
				if(flag||s3[1003-i]) {//直到遇到非零数,拨动开关,不再受零的限制 
					printf("%d",s3[1003-i]);
					flag=1;
				}
			}
		}
		printf("\n");
		j++;
		if(j<=n-1)
			printf("\n");

	}
	return 0;
}

 

【5】

int remaind ( char *  dividend,int  divider) {
	int length=0,remainder=0,i;
	while( dividend[length]!=0) {
		length++;
	}
	for(i=0; i<=length-1; i++) {
		remainder=( (dividend[i]-48)+remainder*10)% divider;
	}
	return remainder;
}

 

以上是关于大数运算的主要内容,如果未能解决你的问题,请参考以下文章

大数高精度运算(模板)

大数四则运算

lua实现大数运算

大数运算 N!

大数运算

c++ 小项目   大数四则运算(整数)