数组开的大小让测试点轮流过了有红... 、
例:
数组35 共30分
数组50 共10分
数组21 共35分
下面代码10分
#include <bits/stdc++.h>
using namespace std;
char start[22];
string normal(char need[],bool u/*哪边去0*/){
char back[22],last[22];
for(int i = strlen(need) - 1,j = 0;i >= 0;i--,j++){//翻转
back[j] = need[i];
}
if(u == 0){//向前去0
bool r = false;
for(int i = 0,j = 0;i < 22;i++)
if(r == true){
last[j] = back[i];
j++;
continue;
}else if(back[i] != '0' && back[i] != 32){
last[j] = back[i];
j++; r = true;
}
}else if(u == 1){//向后去0
int flag2 = -1;
for(int i = 21;i >= 0;i--)
if(back[i] == '1' || back[i] == '2' || back[i] == '3' || back[i] == '4' || back[i] == '5' || back[i] == '6' || back[i] == '7' || back[i] == '8' || back[i] == '9'){
flag2 = i;
break;
}
if(flag2 == -1) return "0";
for(int i = 0;i <= flag2;i++) last[i] = back[i];
}
int l = strlen(last) - 1;
char en[l];
for(int i = 0;i <= l;i++) en[i] = last[i];//保证无其他空字符返回
return en;
}
void point(){//小数
char front[22],behind[22];/*分成前后两段*/ int flag;
for(int i = 0;i < 22;i++)
if(start[i] == '.') flag = i;
for(int i = 0;i < flag;i++) front[i] = start[i];
for(int i = flag+1,j = 0;i < 22;i++,j++) behind[j] = start[i];
cout << normal(front,0) << "." << normal(behind,1);
}
void devide(){//分数
char front[22],behind[22];/*分成前后两段*/ int flag;
for(int i = 0;i < 22;i++)
if(start[i] == '/') flag = i;
for(int i = 0;i < flag;i++) front[i] = start[i];
for(int i = flag+1,j = 0;i < 22;i++,j++) behind[j] = start[i];
cout << normal(front,0) << "/" << normal(behind,0);
}
void ddevide(){//百分
for(int i = 0;i < 22;i++)
if(start[i] == '%') start[i] = 32;
cout << normal(start,0) << "%";
}
int main(){
scanf("%s",start);
for(int i = 0;i < 22;i++)
if(start[i] == '.'){
point();
return 0;
}else if(start[i] == '/'){
devide();
return 0;
}else if(start[i] == '%'){
ddevide();
return 0;
}
cout << normal(start,0);
return 0;
}