基础数学问题

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 基础

VsCode 代码片段-提升研发效率

全网最快掌握机器学习之深度学习之神经网络数学基础(附源代码)

201555332盛照宗—网络对抗实验1—逆向与bof基础

20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础