Editorial for VM 12 Bài 03 - Thử máy
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này
Code mẫu của flashmt
#include <iostream> #include <string> #include <cctype> #include <cmath> using namespace std; int checkType(string s) { int res = 0; for (int i = 0; i < s.size(); i++) if (s[i] >= '0' && s[i] <= '9') res |= 1; else if (tolower(s[i]) >= 'a' && tolower(s[i]) <= 'z') res |= 2; return res; } double getSum(string s) { double res = 0, x = 0, power = 1; s += ' '; for (int i = 0, dotted = 0, sign = 1; i < s.size(); i++) if (s[i] == ' ') res += x/power*sign, power = 1, x = 0, dotted = 0, sign = 1; else if (s[i] == '-') sign = -1; else if (s[i] == '.') dotted = 1; else x = x * 10 + s[i] - '0', power *= (dotted > 0? 10: 1); return res; } string concatStr(string s) { string res = ""; for (int i = 0; i < s.size(); i++) if (s[i] != ' ') res += s[i]; return res; } int main() { string s; while (getline(cin,s)) { if (s=="?") break; int type = checkType(s); if (type == 3) puts("Error!"); else if (type == 1) printf("%.6lf\n",getSum(s)); else cout << concatStr(s) << endl; } }
Code mẫu của ladpro98
const fi=''; var inp:text; s:string; i,l,code:longint; t,sum:extended; err:boolean; begin assign(inp,fi);reset(inp); while true do begin readln(inp,s); err:=false; while s[1]=' ' do delete(s,1,1); if s[1]='?' then break; if s[1] in ['A'..'z'] then begin for i:=1 to length(s) do if (s[i]<>' ') and (not (s[i] in ['A'..'z'])) then begin writeln('Error!'); err:=true; break; end; if err then continue; for i:=length(s) downto 1 do if s[i]=' ' then delete(s,i,1); writeln(s); continue; end; if (s[1]='.') or (s[1]='-') or (s[1] in ['0'..'9']) then begin sum:=0; for i:=length(s) downto 2 do if (s[i]=' ') and (s[i-1]=' ') then delete(s,i,1); if s[length(s)]<>' ' then s:=s+' '; l:=1; for i:=1 to length(s) do if s[i]=' ' then begin Val(copy(s,l,i-l),t,code); l:=i+1; if code<>0 then begin writeln('Error!'); err:=true; break; end; sum:=sum+t; end; if err then continue; writeln(sum:0:6); continue; end; writeln('Error!'); end; close(inp); end.
Code mẫu của RR
//#pragma comment(linker, "/STACK:66777216") #include <iomanip> #include <sstream> #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <vector> #include <set> #include <map> #include <stack> #include <queue> #include <string> #include <deque> #include <complex> #include <bitset> #define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; ++i) #define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; --i) #define REP(i,a) for(int i=0,_a=(a); i<_a; ++i) #define ll long long #define F first #define S second #define PB push_back #define MP make_pair #define DEBUG(x) cout << #x << " = " << x << endl; #define PR(a,n) cout << #a << " = "; FOR(i,1,n) cout << a[i] << ' '; puts(""); #define PR0(a,n) cout << #a << " = "; REP(i,n) cout << a[i] << ' '; puts(""); using namespace std; const double PI = acos(-1.0); char s[100111]; bool allNum() { REP(i,strlen(s)) if (s[i] != ' ') if (s[i] != '-' && s[i] != '.') if (s[i] < '0' || s[i] > '9') return false; return true; } bool allChar() { REP(i,strlen(s)) if (s[i] != ' ') if (s[i] < 'a' || s[i] > 'z') if (s[i] < 'A' || s[i] > 'Z') return false; return true; } int main() { // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); while (gets(s)) { if (s[0] == '?') break; if (allNum()) { istringstream sin(s); long double res = 0.0, x; while (sin >> x) { res += x; } cout << (fixed) << setprecision(6) << res << endl; } else if (allChar()) { istringstream sin(s); string res = "", x; while (sin >> x) { res += x; } cout << res << endl; } else puts("Error!"); } return 0; }
Code mẫu của hieult
#include <set> #include <map> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <string> #include <vector> #include <cstdlib> #include <cstring> #include <sstream> #include <iostream> #include <algorithm> using namespace std; #define Rep(i,n) for(typeof(n) i = 0; i < (n); ++i) #define Repd(i,n) for(typeof(n) i = (n)-1; i >= 0; --i) #define For(i,a,b) for(typeof(b) i = (a); i <= (b); ++i) #define Ford(i,a,b) for(typeof(a) i = (a); i >= (b); --i) bool isword(string s) { int len = s.length(); Rep(i, len) if (!isalpha(s[i])) return false; return true; } bool isnumber(string s) { int minus = 0, dot = 0, posminus = -1, posdot = -1; int len = s.length(); Rep(i, len) { if (s[i] == '-') { ++minus; posminus = i; } else if (s[i] == '.') { ++dot; posdot = i; } else if (!isdigit(s[i])) return false; } if (minus > 1 || dot > 1) return false; if (minus == 1 && posminus != 0) return false; return true; } double convert(string s) { stringstream ss; ss << s; double r; ss >> r; return r; } string line, s; vector<string> a; void process() { int n = a.size(); if (n == 0) { puts("Error!"); return; } double sum = 0; string cat = ""; bool allnumber = true, allword = true; Rep(i, n) { if (isnumber(a[i])) { sum += convert(a[i]); allword = false; } else if (isword(a[i])) { cat = cat + a[i]; allnumber = false; } else { puts("Error!"); return; } } if (allword) cout << cat << endl; else if (allnumber) printf("%.6lf\n", sum); else puts("Error!"); } int main() { while (getline(cin, line) && line != "?") { a.clear(); istringstream iss(line); while (iss >> s) a.push_back(s); process(); } return 0; }
Code mẫu của skyvn97
program test; uses crt; var s,sb,t:string; a,r:real; b,ck:integer; i,j:integer; fst:boolean; num:boolean; str:boolean; err:boolean; function ckstr(s:string):integer; var i:integer; begin b:=0; val(s,a,b); if (b<>0) then begin for i:=1 to length(s) do begin if ord('A')>ord(s[i]) then begin ckstr:=-1; exit; end; if ord('z')<ord(s[i]) then begin ckstr:=-1; exit; end; if (ord('Z')<ord(s[i])) and (ord('a')>ord(s[i])) then begin ckstr:=-1; exit; end; end; ckstr:=1; exit; end else begin ckstr:=0; exit; end; end; begin repeat readln(s); if (length(s)<>1) or (s[1]<>'?') then begin while (pos(' ',s)<>0) do delete(s,pos(' ',s),1); fst:=true; err:=false; str:=false; num:=false; r:=0; t:=''; if s[1]<>' ' then s:=' '+s; if s[length(s)]<>' ' then s:=s+' '; while pos(' ',s)<>length(s) do begin i:=pos(' ',s); for j:=i+1 to length(s) do if s[j]=' ' then break; sb:=copy(s,i+1,j-i-1); ck:=ckstr(sb); if ck<0 then begin err:=true; break; end; if ck=0 then begin if fst then begin fst:=false; num:=true; r:=a; end else begin if str then err:=true else r:=r+a; end; end; if ck>0 then begin if fst then begin fst:=false; str:=true; t:=sb; end else begin if num then err:=true else t:=t+sb; end; end; if err then break; delete(s,i,j-i); end; if err then begin writeln('Error!'); continue; end; if num then begin writeln(r:0:6); continue; end; if str then begin writeln(t); continue; end; end else halt; until false; end.
Comments