标签:main -- multi [] while ret nbsp turn 赋值
概览
1、大整数运算
大整数的定义
struct BigN{ int d[100]; int len;//表示数的位数 BigN(){ memset(d,0,sizeof(d)); len=0; } };
BigN change(char str[]) { BigN a; int len=strlen(str); for(int i=len-1;i>=0;i--)//个位存在a.d[0],十位存在a.d[1]... a.d[a.len++]=str[i]-‘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=carry+a.d[i]+b.d[i]; c.d[c.len++]=temp%10; carry=temp/10; } //最高位还有进位的情况,如999+1=1,000 if(carry>0) c.d[c.len++]=carry; return c; }
大整数与大整数相减(注:比如a-b,这里要求a>0,b>0且a>b,所以在相减之前要先判断一下)
//此处保证a,b都是正的,且a>b BigN sub(BigN a,BigN b) { BigN c; for(int i=0;i<a.len;i++){ if(a.d[i]<b.d[i]){//需要向高位借位 a.d[i]+=10; a.d[i+1]--;//高位减1 } c.d[c.len++]=a.d[i]-b.d[i]; } while(c.len>1 && c.d[c.len-1]==0)//删除可能存在的前导0 c.len--; return c; }
大整数与int型整数相乘(注:认为两者都是正的!所以在相乘前先判断一下)
BigN multiply(BigN a,int k) { BigN c; int carry=0; for(int i=0;i<a.len;i++){ int temp=a.d[i]*k; c.d[c.len++]=temp%10; carry=temp/10; } //这里carry可能不止一位 while(carry>0){ c.d[c.len++]=carry%10; carry=carry/10; } return c; }
大整数与int型整数相除(注:认为两者都是正的!所以在相除前先判断一下)相除似乎从来没考到过,自己也不熟悉,需引起注意!
//remainder为余数,传入时为0 BigN divide(BigN a,int k,int &remainder) { BigN c; c.len=a.len;//注意,先赋值 for(int i=a.len-1;i>=0;i--){ remainder=remainder*10+a.d[i]; c.d[i]=remainder/k; remainder=remainder%k; } //除去高位可能存在的前导0 while(c.len>1 && c.d[c.len-1]==0) c.len--; return c; }
标签:main -- multi [] while ret nbsp turn 赋值
原文地址:https://www.cnblogs.com/kkmjy/p/9531966.html