today,is a good day;
遇到了就是遇到了,,今天的题目,如下:
如图一样可以输出这些结果就OK。
使用一个string类的字符串,存下所有的字符;
然后筛选出一个不属于数字的符号,用一个char类型来保存,顺便记录这个符号所在的位置和下标;
接着就是逆置,分两块逆置,符号前面的和符号后面的;
在逆置之后需要的就是删除首位为0的字符,(我没有想到删掉的方法,只想到了把所有的数据前移这样的粗糙方法),需要注意的就是分清楚前面和后面两个部分的初始下标和救赎下标。
我的代买如下:
#include<iostream>
#include<string>
using namespace std;
int n, k=0;
string s, a;
void reserve(int n,int m) {
char temp;
while (n < m) {
temp = s[n];
s[n] = s[m];
s[m] = temp;
n++, m--;
}
}
int main() {
int j = 0;
cin >> s;
for (int i = 0; s[i]; i++) {
n = i;
if (s[i] < '0' || s[i]>'9') { k = i; }
}
reserve(0, k - 1);
reserve(k + 1, n);
for (int i = 0; s[i] == '0';) {
while (j < n) {
s[j] = s[j + 1];
if (s[j] < '0' || s[j]>'9') { k = i; }
j++;
}
}
for (int i = k+1; s[i] == '0';) {
int r = i;
while (r < n) {
s[r] = s[r + 1];
r++;
}
}
for (int i = 0; i < s.size(); i++)cout << s[i] ;
return 0;
}
可以完成题目的要求,但是在编译的时候只过了一个监测点。我的代码,没有考虑符号的不同,就是直接对所有符号统一操作;
有一个精品代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
char p=0;//放符号
int cnt=0;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9') cnt++;//记录第一个数长度
else //遇到符号,记录,跳出
{
p=s[i];
break;
}
}
int x=cnt;//记下第一个数末后一个的位置,也就是符号的位置,如果是分数或小数就要用
cnt--;
while(s[cnt]=='0'&&cnt>0) cnt--;//去除多余前导0;
for(int i=cnt;i>=0;i--)//输出第一个数
cout<<s[i];
if(p==0) return 0;//无符号return 0
else
if(p=='%') {cout<<p;return 0;}
else cout<<p;//其他继续
int m=s.size()-1;
while(s[x+1]=='0'&&x<m-1) x++;//去除末尾0
while(s[m]=='0'&&m>x+1) m--; //去除多余前导0
for(int i=m;i>x;i--)//输出第二个数
cout<<s[i];
return 0;
}
他这个代码细节比我多一些,比如,他是先计算符号前面的数据的,对前面的数据开始倒叙,除0,然后才是对后面数据的操作。