struct bignum(char str[]){ int i; structbignuma; a.len = stelen(str); for (i = 0; i < a/len; i++) a.d[i] = str[a.len - i - 1] - '0'; //反着存入,字符转为数字 return a; }
二、大整数的比较
先判断二者 len 的大小:
如果不相等,则长的为大
如果相等,再从高位到低位进行比较,直到出现某一位不相等为止。
1 2 3 4 5 6 7 8 9 10
intcompare(struct bignum a, struct bignum b){ if (a.len > b.len) return1; if (a.len < b.len) return-1; int i; for (i = a.len; i >= 0; i--){ if (a.d[i] > b.d[i]) return1; if (a.d[i] < b.d[i]) return-1; } return0; }
三、大整数加法
将两个数字与进位相加,得到的数字个位数作为该位结果,取十位数作为新的进位。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
struct bignum add(struct bignum a, struct bignum b){ structbignumc; int i; int temp; int carry = 0; //进位 for (i = 0; i < a.len || i < b.len; i++){ temp = a.d[i] + b.d[i] + carry; c.d[c.len++] = temp % 10; carry = temp / 10; } if (carry != 0){ c.d[c.len++] = carry; } return c; }
struct bignum multi(struct bignum a, int b struct bignum c; int temp; int carry = 0; //进位 int i; for (i = 0; i < a.len; i++){ temp = a.d[i] * b + carry; c.d[c.len++] = temp % 10; carry = temp / 10; } while (carry != 0){ c.d[c.len++] = carry % 10; carry /= 10; } return c; }
六、大整数和普通数的除法
上一步的余数乘以 10 加上该位上的数,得到此步的临时被除数,将其与除数比较:
如果不够除,则该位的商为 0
如果够除,则商即为该位的商,余数即为该位的余数
最后需要注意是否有多余的 0 ,去除它们,但至少保留一位数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
struct bignum divide(struct bignum a, int b, int &r){ //r为余数 structbignumc; c.len = a.len; int i; for (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) c.len--; return c; }