最大公约数、素数、分数运算、超长整数计算总结

最大公约数

int gcd(int a, int b){   // a % b = c .... r
    if(b == 0)
        return a;
    else return gcd(b, a % b);  //b,    r 
}

最小公倍数: a、b的最大公约数是c,则a、b的最小公倍数是a / c * b。

 

分数运算

1、表示:struct frac{  int up, down }, 运算以假分数形式进行, 输出时再化为代分数。乘除法时,分子分母使用长整数保存。

2、化简: 化简在每一次计算完后进行,先检查分母,若分母小于0,应分子分母同*-1, 若分母等于0,应将 inf 标志置为1;  然后分子分母同除最大公因数(计算时应传入绝对值,求两个绝对值的最大公因数); 两个int分母相乘,有可能溢出,所以分子分母应使用long long保存;      

3、输出时考虑:INF标志; 分子为0时直接输出0;分子>=分母时(用绝对值比较),可以整除则输出整数,否则输出代分数(4/1直接输出4);

 

素数

1、判断素数, 注意下面注释的三个易错点。

int isPrime(int N){
    int sqr = (int)sqrt(N * 1.0);  //N应该转换为小数
    if(N == 1)        //当N = 1时应返回false,容易忽略,1不是素数
        return 0;
    for(int i = 2; i <= sqr; i++){   //i <= sqr; i从2开始查找
        if(N % i == 0)
            return 0;
    }
    return 1;
}

2、筛法求N以内素数表:num[] 数组标记一个数是不是素数。初始2标记为素数。然后从2开始遍历直到N,如果i是素数, 那就把它在N以内的所有倍数都标记为非素数。

 

超长整数计算

1、大整数的记录结构:

typedef struct info{
    int num[100];
    int len;
    info(){
    for(int i = 0; i < 100; i++){    //全初始化为0,这样在做加法时可以直接循环到最长的数,而不是仅仅循环到最短的数就结束。
      num[i] = 0;
    }
    len = 0;
    }
  }bign;

2、大整数加法:

bign add(bign a, bign b){
    int carry = 0;
    bign c;
    for(int i = 0; i < a.len || i < b.len; i++){ //以长的数位界
        int temp = a.num[i] + b.num[i] + carry;
        c.num[i] = temp % 10;
        carry = temp / 10;
        c.len++;
    }
    if(carry != 0)
        c.num[c.len++] = carry;
    return c;
}

3、大整数乘法: 注意最后乘完每一位之后,carry有可能>=10,需要不止1位存储。 注意正负号问题。

 

转载于:https://www.cnblogs.com/zhuqiwei-blog/p/8534753.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值