103 分割数字并排序
问题描述 :
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
输入说明 :
输入包含多组测试用例,第一行,测试案例个数,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
输出说明 :
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
输入范例 :
2
0051231232050775
4000050005045453356356456454564567677686564654
输出范例 :
0 77 12312320
0 4 4 4 4 33 63 64 64 64 646 40000 67677686
思想:用字符存储,然后根据规则进行存入数字,详见注释。
#include <stdio.h> #include <string.h> int main() { int i, j, k,l; int num; char s[1000]; scanf("%d", &num); for (l = 0; l < num; l++) { if(l==0){ getchar(); //首行吸收一下换行符 } gets(s); int nums[30] = {0}; int isStart = 1; //记录是否是开头数字 int flag = 0; //记录是否以0开始且以5结尾 k = 0; for (j = 0; j <strlen(s); j++) { if(isStart) //是开头数字 { if (s[j] == '5') //遇到结尾了 { if(flag){ //如果以0开头,没有其他有效数字 nums[k++] = 0; //更新一个0进去 flag = 0; }else{ continue; } } else if(s[j]=='0'){ flag =1; if(j==strlen(s)-1){ //如果最后一个字符就是000这种,处理一下,把nums最后更新为0,更新一下位数 nums[k++] = 0; } } else{ flag = 0; nums[k] = s[j] - 48; isStart = 0; if(j==strlen(s)-1){ //如果最后一个字符是单数字,处理一下,把nums的位数更新一下 k++; } } } else //不是开头数字 { if (s[j] == '5') //结尾 { isStart = 1; k++; continue; } else //更新当前数字 { nums[k] = nums[k] * 10 + s[j] - 48; if(j==strlen(s)-1){ //如果是最后一位数,那么要更新一下位数 k++; } } } } //冒个序 for (i = 0; i <k; ++i) //比较n-1轮 { for (j = 0; j <k - 1 - i; ++j) //每轮比较n-1-i次, { if (nums[j] > nums[j + 1]) { int temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp; } } } printf("%d",nums[0]); for(i=1;i<k;i++){ printf(" %d",nums[i]); } printf("\n"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义