HDU - 1106 数字字符串的分隔与排序 难度:C++入门 复杂度:一般

先将输入的数字存为字符数组,再从左往右依次将被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的增值)。那正确的做法是应该怎么做呢?(未完待续)

转载于:https://my.oschina.net/u/4035395/blog/3011197

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值