基础数学问题
Posted kkmjy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础数学问题相关的知识,希望对你有一定的参考价值。
概览
- 大整数运算
- 分数运算
- 科学计数法
- 素数
- 因式分解
1、大整数运算
大整数的定义
struct BigN{ int d[100]; int len;//表示数的位数 BigN(){ memset(d,0,sizeof(d)); len=0; } };
其中d[]存放各个位数,len存放长度。如n = 12345,用BigN可以表示成struct BigN a,其中a.d[0]=5,a.d[1]=4, a.d[2]=3, a.d[3]=2, a.d[4]=1; a.len=5。需要注意的是,原整数的高位存储在数组的高位,原整数的低位存储在数组的低位。这么存是为了计算加减的时候更方便,因为遍历数组习惯上从0开始,而运算的时候也是从低位开始。
关于大整数的题,输入的时候一般用字符串的形式,首先,将str[]转化为BigN。
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; }
以上是关于基础数学问题的主要内容,如果未能解决你的问题,请参考以下文章
[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础