全wa求解答

P1307 [NOIP2011 普及组] 数字反转

chieftains @ 2023-07-15 15:24:38

#include<iostream>
using namespace std;
int main()
{
    int flag = 0;
    string s;
    cin >> s;
    if (s[0] == '-') {
        for (int i = 1; i <= s.size() / 2; i++) {
            swap(s[i], s[s.size() - i ]);
        }
        if(s[1] == '0' ) { 
            s.erase(0,s.find_first_not_of('0'));
            flag = 1;
        }
        for (int i = 0; i <= s.size(); i++) {
            cout << s[i];
        }
    }
    else {
        for (int i = 0; i <= s.size()/2; i++) {
            swap(s[i], s[s.size() - i]);
        }
        if (s[0] == '0') s.erase(0, s.find_last_not_of('0'));   //看了大佬的代码,本意去0,但是失败了,不理解
        for (int i = 0; i <= s.size(); i++) {
            cout << s[i];
        }
        //cout<<s;  想直接输出,但是莫名最后一位会丢掉,不理解+2
    }
    return 0;
}

by moment0303 @ 2023-07-15 16:22:15

   检查一下如果s的长度为1的时候

by chieftains @ 2023-07-15 17:21:25

@moment0303 啥意思呀 ?_?


by chieftains @ 2023-07-15 17:27:39

@moment0303 是说只输入1个数字吗?如果只输入一个数字它就是照常输出


by moment0303 @ 2023-07-16 12:35:51

@chieftains搞错了,是输出前面有空格


by moment0303 @ 2023-07-16 12:45:38

Ac了,看看注释

#include<iostream>
using namespace std;
int main()
{
    int flag = 0;
    string s;
    cin >> s;
    //排除特殊情况 
    if(s.size()<2) {
        cout<<s;
    }
    else if(s.size()==2 and s[0]=='-') {
        cout<<s;
    }
    else if (s[0] == '-') {
        for (int i = 1; i <= s.size() / 2; i++) {
            swap(s[i], s[s.size() - i ]);
        }
        //原代码去0有问题
        //修改:
        if(s[1]=='0'){
            int j=1; 
            while (s[j]=='0'){
                for(int i=j;i<s.size();i++){
                    s[i]=s[i+1];
                }
            }
        }
        for (int i = 0; i <= s.size(); i++) {
            cout << s[i];
        }
    }
    else {
        for (int i = 0; i <= s.size()/2-1; i++) {//原代码 是 i <= s.size()/2,当有四个元素时,会访问前三个即下标0,1,2与4,3,2交换,会有空格在前方,所以减一就可以 
            swap(s[i], s[s.size() - i-1]);//这里减一 
        }
        if (s[0] == '0'){  //看了大佬的代码,本意去0,但是失败了,不理解   原因 810颠倒后是018有前置0,要消除 
            int j=0; 
            while (s[j]=='0'){
                for(int i=j;i<s.size();i++){
                    s[i]=s[i+1];
                }
            }

    }
        for (int i = 0; i <= s.size(); i++) {
            cout << s[i];
        }
        //cout<<s;  想直接输出,但是莫名最后一位会丢掉,不理解+2
        //现在好啦 
    }
    return 0;
}

by moment0303 @ 2023-07-16 12:49:32


by moment0303 @ 2023-07-16 12:54:58

这个方法去0要求第一个元素是0,然而你的第一个是负号,所以失败了;题解里是s1=-00000xxxxxxxxx s2=00000xxxxxxxxx 用s2执行操作就不翻车了 我改的代码是用循环的,新手可以理解


by moment0303 @ 2023-07-16 12:56:01

以后尽量简洁代码


by chieftains @ 2023-07-16 15:01:57

@moment0303 好的大佬,我明白了OvO感谢!!


by moment0303 @ 2023-07-16 15:36:42

《大佬》


|