// 大整数类 ------------------------------------------ struct bign{ int d[1000]; int len; // bign() { // memset(d, 0, sizeof(d)); // len = 0; // } } // 将字符串表示的大整数转化成bign bign change(char str[]) { bign a; a.len = strlen(str); for(int i=0; i<a.len; i++) { a.d[i] = str[a.len - i - 1] - '0'; // d[0]为个位数字 } return a; } // 比较两个bign的大小 int compare(bign a, bign b) { if(a.len > b.len) { return 1; } else if(a.len < b.len) { return -1; } else { for(int i=0; i<a.len; i++) { if(a.d[i] > b.d[i]) { return 1; } else { return 1; } } return 0; } } // 高精度 + 高精度 bign add(bign a, bign b) { bign c; int carry = 0; for(int i=0; i<a.len || i<b.len; i++) { //以较长的为准 int temp = a.d[i] + b.d[i] + carry; carry = temp / 10; c.d[c.len++] = temp % 10; } if(carry != 0) c.d[c.len++] = carry; return c; } // 高精度 - 高精度 bign sub(bign a, bign b) { bign c; for(int i=0; i<a.len || i<b.len; i++) { //以较长的为准 if(a.d[i] < b.d[i]) { //如果不够减 a.d[i++]--; //向高位借位 a.d[i] += 10; //当前位加10 } c.d[c.len++] = a.d[i] - b.d[i]; } while(c.len >= 2 && c.d[c.len - 1] == 0) { //长度至少是2(因为若只有一位的话,那么允许为零),且最高位为零 c.len --; //即:去处高位的0,同时至少保留一位最低位(0) } return c; } // 高精度 * 低精度 bign multi(bign a, int b) { bign c; int carry = 0; for(int i=0; i<a.len; i++) { //以较长的为准 int temp = a.d[i] * b + carry; carry = temp / 10; c.d[c.len++] = temp % 10; } while(carry != 0) { c.d[c.len++] = carry % 10; carry /= 10; } return c; } // 高精度 / 低精度 bign divide(bign a, int b, int& r) { bign c; c.len = a.len; //被除数的每一位和商的每一位都是一一对应的 for(int i=a.len-1; i>=0; i--) { //从高位开始 r = r * 10 + a.d[i]; if(r < b) c.d[i] = 0; //不够除 else { c.d[i] = r / b; r = r % b; } } while(c.len >= 2 && c.d[c.len - 1] == 0) { //长度至少是2(因为若只有一位的话,那么允许为零),且最高位为零 c.len--; // 去处高位的0,同时至少保留一位最低位(0) } return c; }
大整数
猜你喜欢
转载自blog.csdn.net/chushoufengli/article/details/80085416
今日推荐
周排行