“我向来是不惮以最坏的恶意来推测中国人的,然而我还不料,也不信竟会凶残到这地步。”
感谢爱丽丝兹贝库鲁的支援,我稍微做了一点删改,并写了一点注释
#include <bits/stdc++.h> using namespace std; int tail;//末尾10的指数 void func(string &s)//处理进位 { s='0'+s;//在字符串之前添加一个0,预防99+1之类的情况发生 for(int i=s.size()-1;i>=0;i--) { if(++s[i]>'9') s[i]='0'; else break; } if(s[0]=='0') s.erase(0,1);//之前添加的前置0没用,则去掉 else tail++;//用到了的话tail++ } void solve() { string s; int n; cin>>s>>n; tail=0; int flag1=0; for(int i=0;i<s.size();i++) { if(s[i]=='.') { flag1=1; break; } } if(flag1==0) s+='.';//放后面等着 if(s[0]=='0') { int i; for(i=2;i<s.size()&&s[i]=='0';i++,tail--) ; tail--; s.erase(0,i); }//这样的话就不用专门输出负号了 else { int k=0; for(;k<s.size();k++) { if(s[k]=='.') break; } tail=k-1; s.erase(k,1);//把'.'删了,这个添上有删掉感觉很没意思,但是主要娶一个tail值,就这么下来了。。。 } while(s.size()<=n) s+='0'; if(s[n]>='5') { s=s.substr(0,n); func(s); s=s.substr(0,n);//这里应该也可以在改进一些 } else s=s.substr(0,n); s.insert(1,"."); if(tail) cout<<s<<"F"<<tail<<endl; else cout<<s<<endl; } int main() { int T; cin>>T; for(int i=0;i<T;i++) { printf("case #%d:\n",i); solve(); } return 0; }
在楼上Saitama大佬的基础上精简了下代码(以稍微上升的时间&空间开销为代价,但这不重要)
#include<bits/stdc++.h> using namespace std; auto const P(30); int main() { int T; cin >> T; for(int cs = 0; cs < T; cs++) { cout << "case #" << cs << ":\n"; string m; int p; cin >> m >> p; m = "0" + m; // 开头补个0防溢出 int b = 0; if(auto dot = m.find('.'); dot != m.npos) { b = dot - m.length() + 1; m.erase(dot, 1); } m += string(P, '0'); b -= P; // 不管精度够不够,末尾先补它30个0 auto nz = m.find_first_not_of('0'); // nz: not_zero b += m.length() - nz - 1; m[nz + p - 1] += m[nz + p] >= '5'; for(int i = nz + p - 1; m[i] > '9'; i--) { m[i] -= 10; m[i - 1] += 1; } if(m[nz - 1] - '0') // 把类似10.0F1的情况改成1.0F2 { nz -= 1; b += 1; } cout << m[nz] << "."; for(size_t i = nz + 1; i < nz + p; i++)cout << m[i]; if(b)cout << "F" << b; cout << "\n"; } }
小数系列还有这道毒瘤题,诶………………
“我向来是不惮以最坏的恶意来推测中国人的,然而我还不料,也不信竟会凶残到这地步。”
感谢爱丽丝兹贝库鲁的支援,我稍微做了一点删改,并写了一点注释
在楼上Saitama大佬的基础上精简了下代码(以稍微上升的时间&空间开销为代价,但这不重要)
小数系列还有这道毒瘤题,诶………………