Bill Total Value題解
阿新 • • 發佈:2021-07-08
題目翻譯
這裡有多張鈔票, 每張鈔票都由名字加面額表示, 鈔票之間沒有空格, 兩張名字相同的鈔票面額相同。對於面額, 一定滿足以下條件:
- 只由數字和 '.' 組成
- 小數部分與整數部分由 '.' 連線
- 小數部分有且僅有兩位, 沒有的用 \(0\) 補全。 如: \(0.10\) , \(14.03\) , \(124.42\)
- 整數部分每三位由 '.' 隔開。 如: \(12.390\) \(23.543.475\)
- '.' 不能作為開頭
例:
- "\(234\)", "\(1.544\)", "\(149.431.10\)", "\(0.99\)", "\(123.05\)" 滿足條件
- "\(.333\)
請求出所有鈔票的總面額, 並按照上述規則輸出
思路詳解
這道題其實比較明顯的就是一道大模擬。 首先可以將名字給直接過濾掉, 就把它當成面額之間的分割就行了。 每個面額就直接用一個 string 先存著, 接著開始用 '.' 把面額分成幾個部分。 對於前面的部分, 直接不看 '.' 當成普通整數來算就行了。 最後一部分, 因為有小數(兩位)和整數(三位)的區別, 所以需要特別判斷一下。
最後是輸出。整數可以用類似於快輸的方法:
void print (int x) { if (x >= 1000) { print (x / 1000); putchar ('.'); printf ("%03d", x % 1000); } else { printf ("%d", x % 1000); } }
而小數部分, 由於精度問題, 可能湊不出來, 所以只能乘 \(100\) 以後四捨五入了:
printf (".%02.0lf", ((x - (int ) (x)) * 100.0));
這樣, 這道題也就完成了。
程式碼:
#include <cstdio> #include <algorithm> #include <string> using namespace std; #define MAXN 100000 string s; void print (int x) { if (x >= 1000) { print (x / 1000); putchar ('.'); printf ("%03d", x % 1000); } else { printf ("%d", x % 1000); } } void print (double x) { print ((int) (x)); if (int (x) != x) { printf (".%02.0lf", ((x - (int ) (x)) * 100.0)); } } int main () { double sum = 0; while (1) { char c = getchar (); s.clear(); while ((c < '0' || c > '9') && c != '.' && c != EOF) { c = getchar (); } if (c == EOF) { break; } while ((c >= '0' && c <= '9') || c == '.') { s.push_back(c); c = getchar (); } int h = s.rfind('.'); if (h == string::npos) { int x = 0; for (int i = 0; i < s.size(); i ++) { if (s[i] != '.') { x = x * 10 + (s[i] ^ 48); } } sum += x; } else { if (s.size() - h - 1 == 3){ int x = 0; for (int i = 0; i < s.size(); i ++) { if (s[i] != '.') { x = x * 10 + (s[i] ^ 48); } } sum += x; } else { int x = 0; int y = 0; for (int i = 0; i <= h; i ++) { if (s[i] != '.') { x = x * 10 + (s[i] ^ 48); } } sum += x; for (int i = h + 1; i < s.size(); i ++) { if (s[i] != '.') { y = y * 10 + (s[i] ^ 48); } } sum += 1.0 * y / 100; } } if (c == EOF) { break; } } print (sum); }
#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
#define MAXN 100000
string s;
void print (int x) {
if (x >= 1000) {
print (x / 1000);
putchar ('.');
printf ("%03d", x % 1000);
}
else {
printf ("%d", x % 1000);
}
}
void print (double x) {
print ((int) (x));
if (int (x) != x) {
printf (".%02.0lf", ((x - (int ) (x)) * 100.0));
}
}
int main () {
double sum = 0;
while (1) {
char c = getchar ();
s.clear();
while ((c < '0' || c > '9') && c != '.' && c != EOF) {
c = getchar ();
}
if (c == EOF) {
break;
}
while ((c >= '0' && c <= '9') || c == '.') {
s.push_back(c);
c = getchar ();
}
int h = -1;
bool bl = 0;
while (s.find ('.', h + 1) != string::npos) {
int t = s.find ('.', h + 1);
if (t - h - 1 > 3 || (h != -1 && t - h - 1 != 3)) {
bl = 1;
break;
}
h = t;
}
if (bl) {
continue;
}
if (h == -1) {
if (s.size() > 3) {
continue;
}
int x = 0;
for (int i = 0; i < s.size(); i ++) {
if (s[i] != '.') {
x = x * 10 + (s[i] ^ 48);
}
}
sum += x;
}
else {
if (s.size() - h - 1 == 1 || s.size() - h - 1 > 3) {
continue;
}
else if (s.size() - h - 1 == 3){
int x = 0;
for (int i = 0; i < s.size(); i ++) {
if (s[i] != '.') {
x = x * 10 + (s[i] ^ 48);
}
}
sum += x;
}
else {
int x = 0;
int y = 0;
for (int i = 0; i <= h; i ++) {
if (s[i] != '.') {
x = x * 10 + (s[i] ^ 48);
}
}
sum += x;
for (int i = h + 1; i < s.size(); i ++) {
if (s[i] != '.') {
y = y * 10 + (s[i] ^ 48);
}
}
sum += 1.0 * y / 100;
}
}
if (c == EOF) {
break;
}
}
print (sum);
}