過載高精
阿新 • • 發佈:2021-01-09
把高精度的數封裝到一個結構體裡,目前只有加和減
struct HighNum { int num[2020]; bool Fu = 0; void Read () { std :: string Du; std :: getline (std :: cin, Du); for (int i = 1; i <= Du.size (); i ++) { num[i] = Du[Du.size () - i] - '0'; } num[0] = Du.size (); if (Du[0] == '-') num[num[0]] = 0, num[0] --, Fu = 1; } void Write () { if (Fu) putchar ('-'); for (int i = num[0]; i >= 1; i --) { printf ("%d", num[i]); } } bool operator < (const HighNum& Ri) { if (Fu == 1 && Ri.Fu == 0) return 1; if (Fu == 0 && Ri.Fu == 1) return 0; if (num[0] != Ri.num[0]) return (Fu == 1 && Ri.Fu == 1) ? ! (num[0] < Ri.num[0]) : num[0] < Ri.num[0]; for (int i = num[0]; i >= 1; i --) { if (num[i] != Ri.num[i]) return (Fu == 1 && Ri.Fu == 1) ? ! (num[i] < Ri.num[i]) : num[i] < Ri.num[i]; } return 0; } bool operator > (const HighNum& Ri) { if (Fu == 1 && Ri.Fu == 0) return 0; if (Fu == 0 && Ri.Fu == 1) return 1; if (num[0] != Ri.num[0]) return (Fu == 1 && Ri.Fu == 1) ? ! (num[0] > Ri.num[0]) : num[0] > Ri.num[0]; for (int i = num[0]; i >= 1; i --) { if (num[i] != Ri.num[i]) return (Fu == 1 && Ri.Fu == 1) ? ! (num[i] > Ri.num[i]) : num[i] > Ri.num[i]; } return 0; } bool operator <= (const HighNum& Ri) { if (Fu == 1 && Ri.Fu == 0) return 1; if (Fu == 0 && Ri.Fu == 1) return 0; if (num[0] != Ri.num[0]) return (Fu == 1 && Ri.Fu == 1) ? ! (num[0] < Ri.num[0]) : num[0] < Ri.num[0]; for (int i = num[0]; i >= 1; i --) { if (num[i] != Ri.num[i]) return (Fu == 1 && Ri.Fu == 1) ? ! (num[i] < Ri.num[i]) : num[i] < Ri.num[i]; } return 1; } bool operator >= (const HighNum& Ri) { if (Fu == 1 && Ri.Fu == 0) return 0; if (Fu == 0 && Ri.Fu == 1) return 1; if (num[0] != Ri.num[0]) return (Fu == 1 && Ri.Fu == 1) ? ! (num[0] > Ri.num[0]) : num[0] > Ri.num[0]; for (int i = num[0]; i >= 1; i --) { if (num[i] != Ri.num[i]) return (Fu == 1 && Ri.Fu == 1) ? ! (num[i] > Ri.num[i]) : num[i] > Ri.num[i]; } return 1; } HighNum operator + (const HighNum& Ri) { HighNum To, a, b; a = *this; b = Ri; for (int i = 1; i <= max (a.num[0], b.num[0]) + 10; i ++) To.num[i] = 0; if (a.Fu == 0 && b.Fu == 1) { b.Fu = 0; To = a - b; return To; } if (a.Fu == 1 && b.Fu == 0) { a.Fu = 0; To = b - a; return To; } if (a.Fu == 1 && b.Fu == 1) { a.Fu = 0; b.Fu = 0; To = a + b; To.Fu = 1; return To; } To.num[0] = max (a.num[0], b.num[0]) + 1; To.num[1] = 0; for (int i = 1; i <= To.num[0]; i ++) { To.num[i] += a.num[i] + b.num[i]; To.num[i + 1] = To.num[i] / 10; To.num[i] %= 10; } if (To.num[To.num[0]] == 0) To.num[0] --; return To; } HighNum operator - (const HighNum& Ri) { HighNum To; HighNum a, b; a = *this; b = Ri; for (int i = 1; i <= max (a.num[0], b.num[0]) + 10; i ++) To.num[i] = 0; if (a.Fu == 0 && b.Fu == 1) { b.Fu = 0; To = a + b; return To; } if (a.Fu == 1 && b.Fu == 0) { a.Fu = 0; To = a + b; To.Fu = 1; return To; } if (a.Fu == 1 && b.Fu == 1) { a.Fu = 0; b.Fu = 0; To = b - a; return To; } if (a < b) { HighNum SWAP; SWAP = a; a = b; b = SWAP; To.Fu = 1; } To.num[0] = max (this -> num[0], Ri.num[0]); for (int i = 1; i <= To.num[0]; i ++) { if (a.num[i] < b.num[i]) { a.num[i] += 10; a.num[i + 1] -= 1; } To.num[i] = a.num[i] - b.num[i]; } while (To.num[To.num[0]] == 0) To.num[0] --; return To; } };