先将输入的数字存为字符数组,再从左往右依次将被5隔开的字符串拷贝到一个新的整型数组(需进行数据类型转换)(题目中有输入数据保证,因此不用担心整型变量可表示范围不足的问题),给新的数组元素进行排序后输出即可(注意避免在最后一个数字右方输出一个额外的空格)。 怎样把数字字符串转化为整型? 定义一个转化函数,以首字符指针和数字个数为参数。从左边开始,每过一个数字,结果+该数字乘以10的(位数-1)次幂(位数用以数字个数为起点递减的循环变量表示)。 (数字字符转化为整型:字符ASCII码值减去48后直接赋值即可) 据题目输入输出要求,这也是道“多组输入数据”类题目。(把多组输入类题目当成单组输入来写会显示Wrong Answer错误)
#include<iostream>
using namespace std;
int mi(int x, int n)//幂运算函数
{
int res = 1;
for (int i = 1; i <= n; i++)
res *= x;
return res;
}
int chartoint(char* t,int length)//将数字字符串转化为整型(数值在整型范围之内)的函数
{
int res = 0, temp;
for (int i = length; i > 0; i--)
{
temp = *(t + length - i) - 48;//暂存该位数字
res += temp*mi(10, i-1);
}
return res;
}
int main()
{
char s[1001] = "\0";
while (cin >> s)
{
int k = 0;
int a[501];
char temp[10];
int m = 0;
for (int i = 0; s[i] != '\0'; i++)
{
for (int j = 0; j < 10; j++)
temp[j] = '\0';//temp初始化
m = 0;//m初始化
if (s[i] != '5')
{
for (int j = i; s[j] != '5'&&s[j] != '\0'; j++)//要用与,不能用或
{
temp[j - i] = s[j];//暂存至temp[]
m++;
}
i += m;
a[k] = chartoint(temp, m);
k++;
}
}//到这里已经得到了被5分隔开的整数的整型数组
for (int i = 0; i < k; i++)
{
for (int j = i + 1; j < k; j++)
{
if (a[i] > a[j])
{
int t = a[j];
a[j] = a[i];
a[i] = t;
}
}
}
cout << a[0];
for (int i = 1; i < k; i++)
cout << " " << a[i];
cout << endl;
}
system("pause");
return 0;
}
这次曾犯一个逻辑错误,即写出类似“a不等于5或者不等于'\0'”的条件句,然而这种条件实际上不可能不满足(或许这一点并不太容易被发现)。此外为了节省a数组的长度,尝试了用多次a=new int[k];(变化k的值)来扩充数组,每多拷贝一个数则k+1,但是失败了,这样的效果是每次都有k份新空间被开辟(而不是在原来的基础上扩充k的增值)。那正确的做法是应该怎么做呢?(未完待续)