码迷,mamicode.com
首页 > 其他好文 > 详细

大数运算

时间:2016-02-22 00:14:14      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

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

 

大数运算

标签:

原文地址:http://www.cnblogs.com/lhy1024/p/5205812.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!