02_对N个长度最长可达到1000的数进行排序、对给定的一个字符串,找出有重复的字符,并给出其位置、输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huanfengyun/article/details/11969621
1.题目描述
对N个长度最长可达到1000的数进行排序。
输入:
输入第一行为一个整数N,(1<=N<=100)。
接下来的N行每行有一个数,数的长度范围为1<=len<=1000。
每个数都是一个正数,并且保证不包含前缀零。
输出:
可能有多组测试数据,对于每组数据,将给出的N个数从小到大进行排序,输出排序后的结果,每个数占一行。
样例输入:
3
11111111111111111111111111111
2222222222222222222222222222222222
33333333
样例输出:
33333333
11111111111111111111111111111
2222222222222222222222222222222222

参考答案

#include<stdio.h>
#include<string.h>

//对 n 个长度最长可达到1000的数进行排序
void sortnum(char num[100][1000], int n)
{
	char temp[1000];
	int k, i;

	//接收输入
	for(k=0; k<n; k++)
	{
		scanf("%s", num[k]);
	}
	for(i=0; i<n; i++)
	{
		for(k=0; k<n-i-1; k++)
		{
			if(strlen(num[k]) > strlen(num[k+1]))
			{
				strcpy(temp, num[k]);
				strcpy(num[k], num[k+1]);
				strcpy(num[k+1], temp);
			}
			else if(strlen(num[k]) == strlen(num[k+1]) && strcmp(num[k], num[k+1])>0)
			{
				strcpy(temp, num[k]);
				strcpy(num[k], num[k+1]);
				strcpy(num[k+1], temp);
			}
		}
	}
}

//输出数据
void output(char num[100][1000], int n)
{
	for(int k=0; k<n; k++)
	{
		printf("%s\n", num[k]);
	}
}

int main()
{
	char num[100][1000];
	int n;
	while(scanf("%d", &n) != EOF)
	{
		sortnum(num, n);
		output(num, n);
	}
	return 0;
}


2. 题目描述:
对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12
输出:a,1;a,4;a,5;a,10,b,2;b,11,1,8;1,12, 2,9;2,13。
输入:
输入包括一个由字母和数字组成的字符串,其长度不超过100。
输出:
可能有多组测试数据,对于每组数据,
按照样例输出的格式将字符出现的位置标出。
样例输入:
abcaaAB12ab12
样例输出:
a:0,a:3,a:4,a:9
b:1,b:10
1:7,1:11
2:8,2:12
提示:
1、下标从0开始。
2、相同的字母在一行表示出其出现过的位置。

参考答案

#include<stdio.h>   
#include<string.h>  
  
typedef struct ch_arr{  
	int index[101];   //记录相同字符出现的位置
	int p;   //记录相应字符出现的次数
	int flag;   //指示相应字符是否输出过
}ch_arr; 
 
int main()  
{   
	ch_arr temp[130];
	char str[101];
	int k, t;
	
	while(scanf("%s", str) != EOF)
	{
		//初始化存储数组
		for(k=0; k<130; k++)
		{
			temp[k].p = 0;
			temp[k].flag = 0;   //flag 表示对应字符未输出过
		}
		//接收用户输入的字符串
		for(k=0; k<strlen(str); k++)
		{
			temp[str[k]].index[temp[str[k]].p] = k;
			temp[str[k]].p++;
		}

		//输出结果
		for(k=0; k<strlen(str); k++)
		{
			if(temp[str[k]].p>1 && 0==temp[str[k]].flag)
			{
				for(t=0; t<temp[str[k]].p-1; t++)
				{
					printf("%c:%d,", str[k], temp[str[k]].index[t]);					
				}				
				printf("%c:%d\n", str[k], temp[str[k]].index[t]);
				temp[str[k]].flag = 1;
			}
		}
	}
    return 0;  
}


3. 题目描述:
输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序。
输入:
输入第一行包括1个整数N,1<=N<=1000,代表输入数据的个数。
接下来的一行有N个整数。
输出:
可能有多组测试数据,对于每组数据,
第一行输出一个整数,代表N个整数中的最大值,并将此值从数组中去除,将剩下的数进行排序。
第二行将排序的结果输出。
样例输入:
4
1 3 4 2
样例输出:
4
1 2 3
提示:
如果数组中只有一个数,当第一行将其输出后,第二行请输出"-1"。

参考答案

#include<stdio.h>   

int main()
{
	int i, k, arr[1000], n;
	while(scanf("%d", &n) != EOF)
	{
		for(i=0; i<n; i++)
		{
			scanf("%d", &arr[i]);
		}
		if(n>1)
		{
			for(i=0; i<n; i++)
			{
				for(k=0; k<n-i-1; k++)
				{
					if(arr[k]>arr[k+1])
					{
						arr[k] = arr[k] + arr[k+1];
						arr[k+1] = arr[k] - arr[k+1];
						arr[k] = arr[k] - arr[k+1];
					}
				}
			}
			printf("%d\n", arr[n-1]);
			for(i=0; i<n-2; i++)
			{
				printf("%d ", arr[i]);
			}
			printf("%d\n", arr[n-2]);
		}
		else
		{
			printf("%d\n", arr[0]);
			printf("-1\n");
		}
	}
	return 0;
}



展开阅读全文