LXYlxy666

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

类别
综合

时间限制
1S

内存限制
1000Kb

问题描述
对于输入的字符串(只包含字母和数字),将其中的连续数字拼接成整数,然后将这些整数按从大到小顺序输出。
例如字符串“abc123d5e7f22k9”中共有5个数字123,5,7,22,9,因此应输出123 22 9 7 5。

输入说明
输入为一个字符串,字符串长度不超过100,其中最长的连续数字不超过10个,字符串中至少包含1个数字。

输出说明
对于输入的字符串,在一行上输出排序结果,整数间以一个空格间隔。

输入样例
abc123d5e7f22k9

输出样例
123 22 9 7 5

#include<stdio.h>
#include<stdlib.h>
void order(long long int n[], int m) {
	int i, j;
	long long int t;
	for (i = 0; i < m; i++) {
		for (j = i; j <= m; j++) {
			if (n[i] < n[j]) {
				t = n[i]; n[i] = n[j]; n[j] = t;
			}
		}
	}
	for (i = 0; i <= m; i++) {
		printf("%lld ", n[i]);
	}
}
int main() {
	char str[102], num[11];
	int  i, j, k, m = 0;
	long long int n[50];
	gets(str);
	for (i = 0; str[i] != 0; i++) {
		if (str[i] >= 48 && str[i] <= 57) {
			for (j = i, k = 0; str[j] != 0 && (str[j] >= 48 && str[j] <= 57); j++, k++) {
				num[k] = str[j];
			}
			num[k] = 0;
			if (k == 10) {
				n[m] = (num[0] - 48) * 1000000000 + (num[1] - 48) * 100000000 +
					(num[2] - 48) * 10000000 + (num[3] - 48) * 1000000 +
					(num[4] - 48) * 100000 + (num[5] - 48) * 10000 +
					(num[6] - 48) * 1000 + (num[7] - 48) * 100 +
					(num[8] - 48) * 10 + (num[9] - 48) * 1;
				m += 1;
			}
			
			else { n[m] = atoi(num); m += 1; }
			i = j - 1;
		}
		else continue;
	}
	order(n, m - 1);

	return 0;
}

  首先声明:该程序有点bug,输出不了9999999999这样大一点的十位数,但是1234567895可以。虽然单数西电oj给我过了,可能是用的测试数据没有那么大吧

本题要注意的点,一开始我没有注意结果没完全过,就是它说最长的连续数字不超过10个,这就说明了int这个数据类型不行,所以换了long long int,然后atoi这个函数只能将九位数正常化为整型,所以单令了一种情况(k==10)单独计算十位数(这也是为啥第一次判断只给了80)

所以说,要注意数据是否有溢出

posted on 2023-03-03 22:10  printf("赖狒狒");  阅读(29)  评论(0编辑  收藏  举报