大数运算
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; }
以上是关于大数运算的主要内容,如果未能解决你的问题,请参考以下文章