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

基础数学问题

时间:2018-08-24 21:17:08      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:main   --   multi   []   while   ret   nbsp   turn   赋值   

概览

  • 大整数运算
  • 分数运算
  • 科学计数法
  • 素数
  • 因式分解

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

 

基础数学问题

标签:main   --   multi   []   while   ret   nbsp   turn   赋值   

原文地址:https://www.cnblogs.com/kkmjy/p/9531966.html

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