3 条题解
-
1
#include<stdio.h> #include<string.h> int main() { long long n; char m[10000]; scanf("%lld", &n); while (n--) { long long b[10000] = {0}; scanf("%s", m); long long d = strlen(m), i; for (long long h = 0; h < d; h++) { b[h + 1] = m[h] - '0'; } long long t[10000] = {0}; for (i = d; i > 0; i--) { if (b[i] >= 5) { b[i - 1]++; b[i] = 0; t[i]++; } } long long c = d; for (long long h = 1; h <= d; h++) { if (t[h] > 0) { c = h; break; } } if (b[0] != 0) { printf("%lld", b[0]); } for (long long j = 1; j <= c; j++) { printf("%lld", b[j]); } for (long long j = c + 1; j <= d; j++) { printf("0"); } printf("\n"); } return 0; } --- -
0
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { string s; cin >> s; for (int i = s.size() - 1; i >= 0; i--) { if (s[i]>= '5') { int j = i - 1; while (j >= 0 && s[j] == '9') { s[j] = '0'; j--; } if (j >= 0) { s[j]++; } else { s = "1" + s; i++; } for (int k = i; k < s.size(); k++) { s[k] = '0'; } i = s.size() - 1; //重新遍历,寻找需要进位数字 } } cout << s << '\n'; } return 0; } -
0
思路: 既然是四舍五入,那当然是越往左越应该入,这样才能使修改后的数更大。 我们可以把整个字符串自右向左扫,只要满足了进位条件,那就进位。并将标记放到这里。 最后输出时,只要在非标记区域,正常输出即可,否则输出 0。
#include <bits/stdc++.h> using namespace std; int t; string s; int main() { cin >> t; while (t--) { cin >> s; s = '0' + s; // 预处理最高位 int sswr = s.size(); for (int i = s.size() - 1; i > 0; i--) { if (s[i] == '9' + 1) { // 满十进一 s[i] = '0'; s[i - 1]++; } if (s[i] >= '5') { // 五入 sswr = i; s[i - 1]++; } } for (int i = 0; i < s.size(); i++) { // 输出 if (i == 0 && s[i] == '0') continue; if (i < sswr) cout << s[i]; else cout << '0'; } puts(""); } return 0; }
- 1
信息
- ID
- 1175
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 196
- 已通过
- 29
- 上传者