P1553 數字反轉(升級版)

Emma,關於這道題,我。。不想說啥子,也就作了它一個下午左右吧(起因:本人太菜)


補充一個知識點goto語句:

這個東西特別的好用,能夠直接無條件調到冒號後面的語句,進行操做。ios

舉個例子:c++

#include"bits/stdc++.h"
using namespace std;

int main() {
    ios::sync_with_stdio(false);//流輸入輸出,讓cin堪比scanf
    int a,b,c,d;
    cin>>a>>b;
    if(a==b) c=a;
    else if(a>b) c=b;
    else goto e;
    if(c==4) {
e:
        for(int i=1; i; i++) {
            d+=i;
        }
    }
    cout<<c<<d;
    return 0;
}

總結一下本身犯得**錯誤:

1.(針對數據點2)如測試數據0.0000 沒有判斷多個0測試

2.(針對數據點4)如測試數據0000/2414 當是分數的時候,沒有判斷前半部分的多個0spa

3.(針對數據點5)如測試數據1234567890.0987654321 ' . ' 後半部分翻轉後0移到末尾,不該該輸出(但我卻輸出了Q)調試

4.(針對數據點6)如測試數據0/10000 輸出的正確結果應爲0/1,但個人倒是0/00001。code

5.(針對數據點20)如測試數據132000.000 輸出應該爲231.0。個人是231000.0。忘記刪去0。ci


針對以上**錯誤,我調了很長時間……嚶。

具體的注意事項在code中有註釋(稍微有點長Q):

#include"bits/stdc++.h"
using namespace std;

#define N 300

char s[N];

int a[N];//沒任何卵用

int cnt=0;//+1

int flag=0;

int main() {
    cin>>s;
    int len=strlen(s);//字符串長度
//特判0
    if((s[0]=='0' && len==1) /*整數*/) {
        cout<<0<<"\n";
        return 0;
    }//一個0
    /*  if((s[0]=='0' && s[1]=='0') ) {//整數
            for(int i=0; i<=len-1; i++)
                if(s[i]=='0') cnt++;
            if(cnt==(len-1))
                cout<<0;
            return 0;
        }//多個0
    */
    cnt=0;
    if((s[0]=='0' && s[1]=='%')/*百分數*/) {
        cout<<0<<"%\n";
        return 0;
    }//針對 0%
    if(s[0]=='0' && s[1]=='0' && len>1) {
        for(int i=0; i<=len-1; i++) {
            if(s[i]=='/' || s[i]=='.') {
                flag=2;
            }
        }
    }//針對相似數據 0000000/2414
    for(int i=0; i<=len-1; i++) {//判斷屬於哪一種類型
        if(s[i]=='.'||s[i]=='/')
            flag=2;//小數,分數
    }
    for(int i=0; i<=len-1; i++) {
        if(s[i]=='%')
            flag=3;//百分數
    }
    if(flag==0) flag=4;//整數
//  cout<<flag<<'\n';//手動調試
    if(flag==4) {//整數
        cnt=0;//歸零
        memset(a,0,sizeof(a));//清空
        if(s[len-1]=='0') {//若是翻轉後開頭是0
            for(int j=len-2; j>=0; j--) {//從開頭接着往前判斷直到找到第一個不是0的位置
                if(s[j]!='0') {
                    for(int i=j; i>=0; i--)
                        cout<<s[i]-'0';
                    return 0;//直接輸出,結束
                }
            }
        }
        if(s[len-1]!='0') { //若是翻轉後開頭不是0
            for(int i=len-1; i>=0; i--) cout<<s[i]-'0';
            return 0;
        }
    }
    if(flag==3) {//百分數
        cnt=0;
        memset(a,0,sizeof(a));//
        if(s[len-2]=='0') {//由於是百分數,因此最後一個確定是符號%,直接從倒數第二個開始,len-1是倒數第一個
            for(int i=len-3; i>=0; i--) {
                if(s[i]!='0') {//跟整數的處理差很少
                    for(int j=i; j>=0; j--)
                        cout<<s[j]-'0';
                    cout<<s[len-1];
                    return 0;
                }
            }
        } else {
            for(int i=len-2; i>=0; i--)//
                cout<<s[i]-'0';
            cout<<s[len-1];
            return 0;
        }
    }
    int b;
    int d=-100;//記錄位置
    if(flag==2) {//小數、分數
        for(int i=0; i<=len-1; i++) {//從頭開始找'.'和'/'
            if(s[i]=='.'||s[i]=='/') {//以它爲界限,分紅先後兩部分
                b=i;
                break;//找到就直接退出循環
            }
        }
        if(s[b-1]=='0' && (b-1==0)) {//若是隻有一個0
            cout<<0;
            goto a;//goto 語句
        } else if(s[b-1]=='0') {//多個0
            for(int y=b-1; y>=0; y--) {
                if(s[y]!='0') {
                    d=y;//記錄位置
                    break;
                }
            }
            if(d==(-100)) goto b;//goto語句,針對此類數據134500000.0000
            for(int y=d; y>=0; y--) cout<<s[y];//輸出前半部分
            goto a;
        }
b:
        if(s[b-1]=='0') {
            for(int j=b-2; j>=0; j--) {//若是存在多個0
                if(s[j]=='0')
                    cnt++;
            }
            if(cnt==(b-1)) {
                cout<<0;
                goto a;
            }
        }//再一次針對這種數據 000000000/2414,一個貌似針對不了
        if(s[b-1]=='0') {//注意翻轉後開頭是否爲0
            for(int j=b-2; j>=0; j--) {//找第一個不是0的位置
                if(s[j]!=0)
                    for(int k=j; k>=0; k--)
                        cout<<s[k];
                break;
            }
        } else if(s[b-1]!='0') {//若是開頭不是0
            for(int j=b-1; j>=0; j--)
                cout<<s[j];
        }
a:
        cout<<s[b];//輸出符號
//找符號界限後面的
        /*
        以符號'.'和'/'爲界限分紅先後兩個部分,(由於它們都位於數字中間,因此能夠將它們歸爲一類)
        */
        cnt=0;//歸零
        if(s[len-1]=='0' && (len-1==b+1) ) {//若是隻有一個0
            cout<<0;
            return 0;
        } else if(s[len-1]=='0') {//若是存在多個0
            for(int j=len-2; j>=b+1; j--) {
                if(s[j]=='0') cnt++;
            }
            if(cnt==(len-2-b)) {
                cout<<0;
                return 0;
            }
        }//針對這種數據 0.000000
        cnt=0;
        int w;//記錄位置
        if(s[b+1]=='0') {
            for(int u=b+2; u<=len-1; u++) {
                if(s[u]!='0') {
                    w=u;
                    break;
                }
            }
            for(int u=b+1; u<w; u++) {
                s[u]='\0';//轉換爲空字符
            }
        }//針對這種數據1234567890.0987654321
        if(s[len-1]=='0') {//注意翻轉後開頭是否爲0
            for(int j=len-2; j>=b+1; j--) {
                if(s[j]!='0') {
                    /*for(int k=j; k>=b+1; k--)
                    if(s[k]=='0' && s[k+1]=='0' && s[k+2]=='0' && s[k+3]=='0' && s[k+4]=='0') {
                        cout<<" ";
                        return 0;
                    }
                    if(s[k]=='0') {
                        for(int l=k; l>=b+1; l--)
                            if(s[k]=='0') cnt++;
                        if(cnt==(k-b)) {
                            s[k]=' ';
                        }
                    }*/
                    for(int l=j; l>=b+1; l--)
                        cout<<s[l];
                    return 0;
                }
            }
        } else if(s[len-1]!='0') { //若開頭不是0
            for(int x=len-1; x>=b+1; x--)
                cout<<s[x];
            return 0;
        }
    }
}
//DARLING in the FRANXX
相關文章
相關標籤/搜索