一道普及题,主要想介绍一下去掉前导0和后导0的方法!
思路
如图用红色笔划掉的就是需要去掉的0。整数和百分数需要去掉前导0,且如果输出为0分别输出0、0%。小数和分数都可以以符号位为分界线分成两个字串来看,那么小数需要去掉前字串的前导0后字串的后导0;分数需要去掉前字串和后字串的前导0。注意:小数在小数点后面有多个0只输出一个0!分数分母输入不为0!
代码
以下代码str为原串,a、b为子串。
正数和百分数
整数和百分数部分几乎相同,唯一不同的是百分号是不需要反转的!
void work1_reverse() { // 整数
reverse(str.begin(),str.end());
while(str.size()>1&&str[0]=='0')str=str.substr(1);
cout << str;
}
void work4_reverse() { // 百分数
int temp = str.find('%');
reverse(str.begin(),str.begin()+temp);
while(str.size()>2&&str[0]=='0')str=str.substr(1);
cout << str;
}
在百分数中str.size()>2是为了再输出0%时避免把0全部删除!
小数和分数
void work2_reverse() { // 小数
int temp = str.find('.');
string a = str.substr(0,temp);
string b = str.substr(temp+1,str.size()-temp-1);
reverse(a.begin(),a.end());
while(a.size()>1&&a[0]=='0')a=a.substr(1);
reverse(b.begin(),b.end());
while(b.size()>1&&b[b.size()-1]=='0')b=b.substr(0,b.size()-1);
cout << a << '.' << b;
}
void work3_reverse() { //分数
int temp = str.find('/');
string a = str.substr(0,temp);
string b = str.substr(temp+1,str.size()-temp-1);
reverse(a.begin(),a.end());
while(a.size()>1&&a[0]=='0')a=a.substr(1);
reverse(b.begin(),b.end());
while(b.size()>1&&b[0]=='0')b=b.substr(1);
cout << a << '/' << b;
}