二维数组web
int n, len, f[5050][5050]; void High_precision_add(int k) { for(int i = 1;i <= len ;i++) f[k][i] = f[k - 1][i] + f[k - 2][i]; for(int i = 1;i <= len; i++) { if(f[k][i] >= 10) { f[k][i + 1] += f[k][i] / 10; f[k][i] %= 10; if(f[k][len + 1] > 0) len++; } } } void solve() { cin >> n; len = 1; f[1][1] = 1; f[2][1] = 2; for(int i = 3;i <= n; i++) { High_precision_add(i); } for(int i = len;i >= 1; i--) cout << f[n][i]; }
字符串数组
string High_precision_add(string a, string b) { string ans = ""; int p[5005], q[5005]; mem(p, 0); mem(q, 0); int len_a = a.length(), len_b = b.length(); for(int i = 0;i < len_a; i++) p[len_a - 1 - i] = a[i] - '0'; for(int i = 0;i < len_b; i++) q[len_b - 1 - i] = b[i] - '0'; int len_max = len_a > len_b ? len_a : len_b; for(int i = 0;i < len_max; i++) { p[i] += q[i]; p[i + 1] += p[i] / 10; p[i] %= 10; } if(p[len_max]) len_max++; for(int i = len_max - 1;i >= 0; i--) ans += (p[i] + '0'); return ans; }
字符串,大的非负整数减少的非负整数svg
string High_precision_sub(string a, string b) { string ans = ""; int p[5005], q[5005]; mem(p, 0); mem(q, 0); int len_a = a.length(), len_b = b.length(); for(int i = 0;i < len_a; i++) p[len_a - 1 - i] = a[i] - '0'; for(int i = 0;i < len_b; i++) q[len_b - 1 - i] = b[i] - '0'; int len_max = len_a > len_b ? len_a : len_b; for(int i = 0;i < len_max; i++) { p[i] -= q[i]; if(p[i] < 0) { p[i] += 10; p[i + 1]--; } } while(!p[len_max - 1] && len_max) len_max--; for(int i = len_max - 1;i >= 0; i--) ans += (p[i] + '0'); if(ans == "") return "0"; return ans; }
字符串spa
string High_precision_mul(string a, string b) { string ans; int p[5005], q[5005], s[5005]; mem(p, 0); mem(q, 0); mem(s, 0); int len_a = a.length(), len_b = b.length(); for(int i = len_a - 1;i >= 0; i--) p[len_a - i] = a[i] - '0'; for(int i = len_b - 1;i >= 0; i--) q[len_b - i] = b[i] - '0'; for(int i = 1;i <= len_a; i++) for(int j = 1;j <= len_b; j++) s[i + j - 1] += p[i] * q[j]; for(int i = 1;i <= len_a + len_b; i++) { s[i + 1] += s[i] / 10; s[i] %= 10; } if(s[len_a + len_b]) ans += s[len_a + len_b] + '0'; for(int i = len_a + len_b - 1;i >= 1; i--) { ans += s[i] + '0'; } return ans; }
字符串code
int sub(int *p, int *q, int len_a, int len_b) { if(len_a < len_b) return -1; if(len_a == len_b) { for(int i = len_a - 1;i >= 0; i--) { if(p[i] > q[i]) break; else if(p[i] < q[i]) return -1; } } for(int i = 0;i < len_a; i++) { p[i] -= q[i]; if(p[i] < 0) { p[i] += 10; p[i + 1]--; } } for(int i = len_a - 1;i >= 0; i--) { if(p[i]) return i + 1; } return 0; } string High_precision_div(string a, string b, int flag) { string ans, cnt; int p[5005], q[5005], s[5005]; mem(p, 0); mem(q, 0); mem(s, 0); int len_a = a.length(), len_b = b.length(); int len = len_a; for(int i = len_a - 1;i >= 0; i--) p[len_a - i - 1] = a[i] - '0'; for(int i = len_b - 1;i >= 0; i--) q[len_b - i - 1] = b[i] - '0'; if(len_a < len_b || (len_a == len_b && a < b)) return a; // cout << "0" << endl; int t = len_a - len_b; for(int i = len_a - 1;i >= 0; i--) { if(i >= t) q[i] = q[i - t]; else q[i] = 0; } len_b = len_a; for(int j = 0;j <= t; j++) { int temp; while((temp = sub(p, q + j, len_a, len_b - j)) >= 0) { len_a = temp; s[t - j]++; } } for(int i = 0;i < len_a; i++) { s[i + 1] += s[i] / 10; s[i] %= 10; } int k = len; while(!s[k]) k--; while(k >= 0) ans += s[k--] + '0'; // 商 k = len; while(!p[k]) k--; while(k >= 0) cnt += p[k--] + '0'; // 余数 if(cnt.empty()) cnt = "0"; if(flag == 1) return ans; return cnt; }