1. 程式人生 > 其它 >Bill Total Value題解

Bill Total Value題解

原題連結

題目翻譯

這裡有多張鈔票, 每張鈔票都由名字加面額表示, 鈔票之間沒有空格, 兩張名字相同的鈔票面額相同。對於面額, 一定滿足以下條件:

  1. 只由數字和 '.' 組成
  2. 小數部分與整數部分由 '.' 連線
  3. 小數部分有且僅有兩位, 沒有的用 \(0\) 補全。 如: \(0.10\) , \(14.03\) , \(124.42\)
  4. 整數部分每三位由 '.' 隔開。 如: \(12.390\) \(23.543.475\)
  5. '.' 不能作為開頭

例:

  • "\(234\)", "\(1.544\)", "\(149.431.10\)", "\(0.99\)", "\(123.05\)" 滿足條件
  • "\(.333\)
    ", "\(3.33.11\)", "\(12.00\)", "\(.33\)", "\(0.1234\)", "\(1.2\)" 不滿足條件

請求出所有鈔票的總面額, 並按照上述規則輸出

思路詳解

這道題其實比較明顯的就是一道大模擬。 首先可以將名字給直接過濾掉, 就把它當成面額之間的分割就行了。 每個面額就直接用一個 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);
}