【南陽ACM】数字区切り(二)

1898 ワード


数値区切り(2)
時間制限:1000 ms|メモリ制限:65535 KB
難易度:3
説明
遠い国では、銀行がユーザーの注文をより速くよりよく処理するために、一連の数字を一定のルールで区切ることにしました.区切るルールは以下の通りです.
1、実数の整数部を3つの数字ごとにカンマで区切る(整数部の上位に余分な0がある場合は、まず余分な0をフィルタリングしてから、数値区切る.例えば:0001234567出力結果は1234567.00)
2、小数部は2桁の小数を保留する(四捨五入)
3、この数が負の場合、出力時に区切られた数字をかっこで囲む必要があります.例えば、-10005.1645の出力結果は(10005.16)
入力
複数のテストデータのセットで、各行に実数n(nのビット数が100未満)を入力します.
しゅつりょく
区切りの結果を出力
サンプル入力
00012345670.0000
-10005.1645

サンプル出力
1,234,567.000.00
(10,005.16)

本題は99.999を考慮する必要がある.3546;-0;35456.などの特殊な状況は、具体的な解釈はコードを参照してください.
コードは次のとおりです.
 
#include
using namespace std;
string str;

int main()
{
    int l,lose,last,first,remainder,aunt,i;
    while(cin>>str)
    {
        string s="0";
        lose=0;i=0;
        if(str[0]=='-')  {lose=1;str[0]='0';}   //lose        ();
        else
        {
          s+=str;
          str=s;
        }
        l=str.length();
        last=l;           //last         ,       。
        for(i=0;i3&&str[last+3]>52)  //       2 ,      “    ”。
        {
            int more=1;
            int num;
            for(int j=last+2;j>=0;j--)
            {
                if(j==last)  continue;
                num=str[j]-48;
                num+=more;
                more=num/10;
                num=num%10;
                str[j]=num+48;
                if(more==0)  break;
            }
        }
        for(i=0;i<=last;i++)   //       ‘0’   。
        {
            if(str[i]!='0') {first=i;break;}
        }
        remainder=(last-first)%3;
        if(lose)   cout<=3)          //      。
            cout<