這道題是不是難倒小夥伴們啦哈哈哈,這個升級版有點坑,思路比較簡單,但是代碼實現比較麻煩,小孱弱弱不才,犯了好多錯誤才AC,哈哈哈,沒事,我的方法註定是大多數人能理解的,下面我們說一說:
———首先呢,它有四種情況:百分數(百分號-%),小數(小數點-.),分數(除號-/)整數 ,我們可以大致分成兩類,百分數和整數一類,小數和分數一類。
———先說整數,很簡單STL中的reserve+迭代器,輕鬆解決,然後去掉前導零就歐克了,至於百分數嘛,百分數一定是在字符串的最後一位,一定要保留下來,反轉後加上%,然後去掉前導零,歐克了。
———小數和分數,先遍歷字符串,用一個變量記住符號位的位置,然後將前半部分和後半部分分別像處理整數那樣,然後整合到原始字符串輸出即可。簡單不,高興的有點早哈哈哈,後面就來坑了,所有的部分都可能是0,我就因爲這個掐住兩次,嗚嗚嗚嗚
———今天看到一句話感覺不錯:凡爲過往,皆爲序章,承認失敗,砥礪前行!!最爲最文藝的小哥哥我,當然若有所思哈哈哈哈哈哈哈
上代碼:
#include <iostream>
#include <algorithm>
using namespace std;
string str;
void fun1(int n)
{
if(n==1||n==2)//小數或者除號
{
int p;
for(int i=0;i<str.size();i++)
{
if(str[i]=='.'||str[i]=='/')
{
p=i;
break;
}
}
string temp1(str.begin(),str.begin()+p);
string temp2(str.begin()+p+1,str.end());
string a(str,p,1);
if(temp1!="0")
while(temp1[0]=='0')
temp1.erase(temp1.begin());
if(temp2!="0")
while(temp2[0]=='0')
temp2.erase(temp2.begin());
reverse(temp1.begin(),temp1.end());
reverse(temp2.begin(),temp2.end());
// cout<<temp1<<' '<<temp2<<endl;
if(temp1!="0")
while(temp1[0]=='0')
temp1.erase(temp1.begin());
if(temp2!="0")
while(temp2[0]=='0')
temp2.erase(temp2.begin());
str.clear();
str.append(temp1);
str.append(a);
str.append(temp2);
// cout<<temp1<<' '<<temp2<<endl;
}
if(n==3)//無符號
{
if(str=="0%")
{
cout<<"0%";
return ;
}
while(str[0]=='0')
str.erase(str.begin());
reverse(str.begin(),str.end()-1);
while(str[0]=='0')
str.erase(str.begin());
}
if(n==4)//百分號
{
while(str[0]=='0')
str.erase(str.begin());
reverse(str.begin(),str.end());
while(str[0]=='0')
str.erase(str.begin());
}
cout<<str;
}
int main()
{
cin>>str;
for(int i=0;i<str.size();i++)
{
if(str=="0")
{
cout<<0;
return 0;
}
if(str[i]=='%')
{
fun1(3);
return 0;
}
else if(str[i]=='.')
{
fun1(1);
return 0;
}
else if(str[i]=='/')
{
fun1(1);
return 0;
}
}
fun1(4);
return 0;
}