典型的模拟的题目
思路:题目要求怎么做我们就怎么做
易错点: 1.在遍历字符串时,无论是4-s还是s-4都是按原来的输入的进行输出(题目要求的)
2.头-尾,每次输出完头之后,不用输出尾,然后i+=1,然后for就循环出i又+=1了,然后新的一次for循环来处理上一个没输出的尾,不然会导致尾重复输出,或者c-e-d输出ce-d的情况!
下面是我的代码(菜鸟写的代码,大佬勿喷)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int p1, p2, p3;
string s;
string ans;
cin >> p1 >> p2 >> p3;
cin >> s;
int size = s.size();
if (p3 == 1)
{
//-两侧输入的同为小写字母或数字
for (int i = 0; i < size; i++)
{
if ((i + 1 < size) && (i + 2 < size) && (s[i + 1] == '-') && (s[i + 2] - s[i] > 0)&&((s[i+2]>='0'&&s[i+2]<='9'&&s[i]>='0'&&s[i]<='9')||
(s[i + 2] >= 'a' && s[i + 2] <= 'z' && s[i] >= 'a' && s[i] <= 'z')))
{
if (s[i + 2] - s[i] == 1)
{
cout << s[i];
i += 1;
}
else
{
int distance = s[i + 2] - s[i];//看两个数差多远
cout << s[i];
for (int j = 1; j < distance; j++)
{
int tmp = p2;
switch (p1)
{
case 1:
{
while (tmp > 0)
{
cout << char(s[i] + j);
tmp--;
}
break;
}
case 2:
{
if (s[i] >= 'a' && s[i] <= 'z')//说明是字符,大写字母
{
while (tmp > 0)
{
cout << char(s[i] + j - 32);
tmp--;
}
}
else
{
while (tmp > 0)
{
cout << char(s[i] + j);
tmp--;
}
}
break;
}
case 3:
{
while (tmp > 0)
{
cout << '*';
tmp--;
}
}
}
}
i += 1;
}
}
else
{
cout << s[i];
}
}
}
else if (p3 == 2)
{
//-两侧输入的同为小写字母或数字
for (int i = 0; i < size; i++)
{
if ((i + 1 < size) && (i + 2 < size) && (s[i + 1] == '-') && (s[i + 2] - s[i] > 0) && ((s[i + 2] >= '0' && s[i + 2] <= '9' && s[i] >= '0' && s[i] <= '9') ||
(s[i + 2] >= 'a' && s[i + 2] <= 'z' && s[i] >= 'a' && s[i] <= 'z')))
{
if (s[i + 2] - s[i] == 1)
{
cout << s[i];
i += 1;
}
else
{
int distance = s[i + 2] - s[i];//看两个数差多远
cout << s[i];
for (int j = distance-1; j >0; j--)
{
int tmp = p2;
switch (p1)
{
case 1:
{
while (tmp > 0)
{
cout << char(s[i] + j);
tmp--;
}
break;
}
case 2:
{
if (s[i] >= 'a' && s[i] <= 'z')//说明是字符,大写字母
{
while (tmp > 0)
{
cout << char(s[i] + j - 32);
tmp--;
}
}
else
{
while (tmp > 0)
{
cout << char(s[i] + j);
tmp--;
}
}
break;
}
case 3:
{
while (tmp > 0)
{
cout << '*';
tmp--;
}
}
}
}
i += 1;
}
}
else
cout << s[i];
}
}
return 0;
}