02 高精度
AcWing 1474. 多项式 A + B
问题描述
分析
代码
#include <iostream>
using namespace std;
const int N = 1010;
double a[N], b[N], c[N];
int main() {
int k;
cin >> k;
while (k--) {
int n;
double v;
cin >> n >> v;
a[n] = v;
}
cin >> k;
while (k--) {
int n;
double v;
cin >> n >> v;
b[n] = v;
}
for (int i = 0; i < N; i++)
c[i] = a[i] + b[i];
k = 0;
for (int i = 0; i < N; i++)
if (c[i])
k++;
cout << k;
for (int i = N - 1; i >= 0; i--)
if (c[i])
printf(" %d %.1lf", i, c[i]);
return 0;
}
时空复杂度分析
- 时间复杂度:
O
(
N
)
O(N)
O(N),
N 为1000 。 - 空间复杂度:
O
(
N
)
O(N)
O(N)。
AcWing 1481. 多项式乘积
问题描述
分析
代码
#include <iostream>
using namespace std;
const int N = 1010;
double a[N], b[N], c[N * 2];
int main() {
int k;
cin >> k;
while (k--) {
int n;
double v;
cin >> n >> v;
a[n] = v;
}
cin >> k;
while (k--) {
int n;
double v;
cin >> n >> v;
b[n] = v;
}
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
c[i + j] += b[i] * a[j];
k = 0;
for (int i = 0; i < N * 2; i++)
if (c[i])
k++;
cout << k;
for (int i = N * 2 - 1; i >= 0; i--)
if (c[i])
printf(" %d %.1lf", i, c[i]);
cout << endl;
return 0;
}
时空复杂度分析
- 时间复杂度:
O
(
N
)
O(N)
O(N),
N 为1000 。 - 空间复杂度:
O
(
N
)
O(N)
O(N)。
AcWing 1500. 趣味数字
问题描述
分析
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
string s;
cin >> s;
vector<int> a;
for (int i = s.size() - 1; i >= 0; i--) a.push_back(s[i] - '0');
vector<int> b;
for (int i = 0, t = 0; i < a.size() || t; i++) {
if (i < a.size()) t += a[i] + a[i];
b.push_back(t % 10);
t /= 10;
}
vector<int> c = b;
sort(a.begin(), a.end());
sort(c.begin(), c.end());
if (a == c) puts("Yes");
else puts("No");
for (int i = b.size() - 1; i >= 0; i--) cout << b[i];
cout << endl;
return 0;
}
时空复杂度分析
AcWing 1501. 回文数
问题描述
分析
代码
#include <iostream>
#include <vector>
using namespace std;
bool check(vector<int> &num) {
for (int i = 0, j = num.size() - 1; i < j; i++, j--)
if (num[i] != num[j])
return false;
return true;
}
vector<int> add(vector<int> &a, vector<int> &b) {
vector<int> c;
for (int i = 0, t = 0; i < a.size() || i < b.size() || t; i++) {
if (i < a.size()) t += a[i];
if (i < b.size()) t += b[i];
c.push_back(t % 10);
t /= 10;
}
return c;
}
int main() {
string n;
int k;
cin >> n >> k;
vector<int> a;
for (int i = n.size() - 1; i >= 0; i--) a.push_back(n[i] - '0');
int cnt = 0;
if (!check(a)) {
while (cnt < k) {
vector<int> b(a.rbegin(), a.rend());
a = add(a, b);
cnt++;
if (check(a)) break;
}
}
for (int i = a.size() - 1; i >= 0; i--) cout << a[i];
cout << endl << cnt << endl;
return 0;
}
AcWing 1544. 霍格沃茨的 A + B
问题描述
分析
代码
#include <cstdio>
int main() {
int a, b, c, d, e, f;
scanf("%d.%d.%d %d.%d.%d", &a, &b, &c, &d, &e, &f);
a += d, b += e, c += f;
b += c / 29, c %= 29;
a += b / 17; b %= 17;
printf("%d.%d.%d\n", a, b, c);
return 0;
}
AcWing 1629. 延迟的回文数
问题描述
分析
-
模拟。按照题目要求进行运算即可。 -
关于高精度可以参考:高精度运算。
代码
#include <iostream>
#include <vector>
using namespace std;
bool check(vector<int> &num) {
for (int i = 0, j = num.size() - 1; i < j; i++, j--)
if (num[i] != num[j])
return false;
return true;
}
vector<int> add(vector<int> &a, vector<int> &b) {
vector<int> c;
for (int i = 0, t = 0; i < a.size() || i < b.size() || t; i++) {
if (i < a.size()) t += a[i];
if (i < b.size()) t += b[i];
c.push_back(t % 10);
t /= 10;
}
return c;
}
void out(vector<int> &a) {
for (int i = a.size() - 1; i >= 0; i--) cout << a[i];
}
void output(vector<int> &a, vector<int> &b, vector<int> &c) {
out(a);
cout << " + ";
out(b);
cout << " = ";
out(c);
cout << endl;
}
int main() {
string s;
cin >> s;
vector<int> a;
for (int i = s.size() - 1; i >= 0; i--) a.push_back(s[i] - '0');
int cnt = 0;
bool flag = false;
if (!check(a)) {
while (cnt < 10) {
vector<int> b(a.rbegin(), a.rend());
vector<int> c = add(a, b);
output(a, b, c);
a = c;
cnt++;
if (check(a)) {
flag = true;
break;
}
}
} else {
flag = true;
}
if (!flag) puts("Not found in 10 iterations.");
else {
out(a);
puts(" is a palindromic number.");
}
return 0;
}
|