STUD 程序设计基础 实验五----一维数组(持续更新)

        

因为自身水平有限,最后田忌赛马和图书馆的题就没更啦
第16题有一个点怎么也过不去了,没想明白,别的应该问题不大

7-1 sdut- C语言实验—最值

有一个长度为n的整数序列,其中最大值和最小值不会出现在序列的第一和最后一个位置。
请写一个程序,把序列中的最小值与第一个数交换,最大值与最后一个数交换。输出转换好的序列。

输入格式:

输入包括两行。
第一行为正整数n(1≤n≤10)。
第二行为n个正整数组成的序列。

输出格式:

输出转换好的序列。数据之间用空格隔开。

输入样例:

6
2 3 8 1 4 5

输出样例:

1 3 5 2 4 8
#include<stdio.h>
int main()
 {
	int n, item, ma, mi, i; //item是中间变量,ma,mi用来存数组下标 
	int maxn, minn; 
	int a[10];
	scanf("%d",&n); 
	for(i = 0 ; i < n; i ++)
	 {
		scanf("%d",&a[i]); 
	}
	if( n == 1)
    {
        printf("%d",a[0]);
        return 0;
    }/*这个if的分支结构特别重要❤,如果没有的话输出
	单个数据会发生数组越界的错误从而显示运行时错误
	用return 0;是提前正常终止代码运行⭐⭐⭐!非常重要!*/ 
    else
    {
	maxn = a[0];  
	minn = a[0]; //先用给数组首项给中间变量赋初值 
	for(i = 0; i < n; i ++) 
	{
		if(a[i] > maxn) 
		{
			maxn = a[i];
			ma = i;//存一下最大值的下标 
		}
		if(a[i] < minn) 
		{
			minn = a[i];
			mi = i;//存一下最小值的下表 
		}  
	}
	
	/*以上的代码是用来打擂台😄这样下来就把
	最值的下标明确了,从而再进行位置交换完成题目要求*/ 
	item = a[ma]; 
	a[ma] = a[n-1]; 
	a[n-1] = item; 
	//交换最大值,给数组的最后一项 
	item = a[mi];
	a[mi] = a[0];
	a[0] = item;
	//交换最小值给数组的首项 
	
	//到目前a[0]为最小值,a[n-1]为最大值 ✌✌

	for(i = 0 ; i < n ; i ++) //按照顺序正常输出 
	{
		if(i == 0) 
			printf("%d",a[i]); //保证第一个元素输出时没有空格!注意细节 😊
		else
			printf(" %d",a[i]);  
	}
    }//else的}
	return 0;
}

7-2 sdut-C语言实验-整数位

输入一个不多于5位的正整数,要求:
(1)求出它是几位数;
(2)分别输出每一位数字;
(3)按逆序输出各位数字。

输入格式:

输入一个不多于5位的正整数。

输出格式:

输出数据有3行,第一行为正整数位数,第二行为各位数字,第三行为逆序的各位数字。

输入样例:

123

输出样例:

3
1 2 3
3 2 1
#include<stdio.h>
int main()
 {
	int n,i;
	int cnt = 0;//初始化cnt为零
	int arr[10086];//定义数组
	scanf("%d",&n);
	int item = n;//用中间变量临时存一下n的值
	for( i = 0 ; item > 0 ; i ++)
	 {
		arr[i] = item % 10;//把每一位存进arr[i]
		item /= 10;//item自除减位
		cnt ++;//记录n的位数
	}
    /*存储完后的对应关系:EX输入 12345
    arr[0] arr[1] arr[2] arr[3] arr[4] arr[5]
    5      4      3      2      1      null
    这个时候体现计数器的用处,cnt此时为5,去靠拢数组下标*/
	printf("%d",cnt);//打印答案第一行
	printf("\n");//打印换行❤
	for( i = cnt - 1 ; i >= 0 ; i --) 
	{//先正序输出,i = 4开始,直到0
		if( i != 0 )
			printf("%d ",arr[i]);
		else
			printf("%d",arr[i]);//注意格式🤯🤯
	}
    printf("\n");//打印换行
	for( i = 0 ; i <= cnt - 1 ; i ++)
	 {
		if( i != cnt - 1)
			printf("%d ",arr[i]);
		else
			printf("%d",arr[i]);
	}
	return 0;
}//✌( •̀ ω •́ )✌

7-3 sdut-C语言实验-区间之和

给定一个由 n 个整数组成的序列A1,A2,……, An 和两个整数L,R,你的任务是写一个程序来计算序列号在L,R 这段位置区间内所有数的总和。

输入格式:

输入只有一组测试数据:

测试数据的第一行为一个整数 n (1< n < 10000);

第二行为 n 个 int 类型的整数;

第三行为两个整数 L,R(0 < L < R <= n)。

输出格式:

输出序列号在区间[L,R]内所有数的和,数据保证和在 int 类型范围内

输入样例:

5
3 5 6 2 9
2 4

输出样例:

13
#include<stdio.h>
int main()
{
    int n,i;
    int sum = 0;
    int L,R;//一定注意这里的L和R是位置
    scanf("%d",&n);//输入位数
    int arr[n];//如果[n]内是变量的话一定要声明在前
    for( i = 1 ; i <= n ; i ++)
    {
        scanf("%d",&arr[i]);
    }//把每一个数字存进数组里,下标从1开始,这样能与L,R对应顺序
    scanf("%d %d",&L,&R);//输入给定的区间长度😢
    if(L > R)
    {
       int item = L;
           L = R;
           R = item;
    }//保证L > R,保证顺序👿👿
    for( i = L ; i <= R ; i ++)//一定要取到闭区间,右边要有'='🤬
    {
        sum += arr[i];//把[L,R]内的数字都加和
    }
    printf("%d",sum);
    return 0;
}

7-4 sdut-C语言实验-分割整数

从键盘输入一个长整数(不超过10位),从高位开始逐位分割并输出。

输入格式:

正整数n,不含前导零。

输出格式:

分割的整数序列,各整数之间用空格格开。
注意,最后一个数字后面没有空格!

输入样例:

678123

输出样例:

在这里给出相应的输出。例如:

6 7 8 1 2 3
#include<stdio.h>
int main()
{
    int n,i;
    int cnt = 0;//计数器初始化为0
    int arr[10086];
    scanf("%d",&n);
    int item = n;//把n的值存一下
    for( i = 0 ; item > 0 ; i ++)
    {
        arr[i] = item % 10;//把n的每一位存进数组里
        item /= 10;
        cnt ++;
    }
    if( cnt == 1)
    {
        printf("%d",arr[0]);
        return 0;
    }//虽然测试点没有单个数字,但是要考虑到⭐⭐⭐
    for( i = cnt - 1 ; i >= 0 ; i --)//倒序输出出来,cnt - 1详解看前面第二题
    {
        if(i!=0)
            printf("%d ",arr[i]);
        else
            printf("%d\n",arr[i]);//注意格式❤
    }
    return 0;
}

7-5 sdut-C语言实验-众数

众数是指在一组数据中,出现次数最多的数。例如:1, 1, 3 中出现次数最多的数为 1,则众数为 1。

给定一组数,你能求出众数吗?

输入格式:

输入数据有多组(数据组数不超过 50),到 EOF 结束。

对于每组数据:

第 1 行输入一个整数 n (1 <= n <= 10000),表示数的个数。
第 2 行输入 n 个用空格隔开的整数 Ai (0 <= Ai <= 1000),依次表示每一个数。

输出格式:

对于每组数据,在一行中输出一个整数,表示这组数据的众数。

数据保证有唯一的众数。

输入样例1:

3
1 1 3

输出样例1:

1

输入样例2:

5
0 2 3 1 2

输出样例2:

2
#include <stdio.h>
int main()
{
    int a,n,item,i;
    while(scanf("%d",&n) != EOF)//输入多组数据
    {
        int arr[1001]={0};//定义数组内所有的变量为0,范围[0,1000]
        int maxn = 0;
        for( i = 0 ; i < n ; i ++)
        {
            scanf("%d",&a);//输入各个元素
            arr[a]++;//出现的那个元素对应的数组的数值+1(原本是0)    
        /*统计'0'到'1000'对应的数出现的次数例如:若输入8,便在“arr[8]”中'+1',
        最后如果arr[8]=5,即为8输入了五次🆒🆒🆒*/
        }
        for( i = 0 ; i <= 1000 ; i ++)//寻找出现最多次数的数组
        {
            if(arr[i] > maxn)
            {
             maxn = arr[i];//打擂台的思路去找到那个下标最大的数组
             item = i;//定义中间变量保存其下标✌
            }
        }
        printf("%d\n",item);//循环之外的变量要在循环之外定义😊😊
    }
    return 0;
}

7-6 sdut- C语言实验-数日子

时间如白驹过隙,大一的时光也是转眼就结束,因此要抓住每一寸光阴提升自己。你知道今天是这一年第几天吗,掐指一算还是要算好久,呵呵还是让计算机来做吧。这里的问题就是让你来写一个程序,输入某年某月某日,判断这一天是这一年的第几天?

输入格式:

输入第一行是数据的组数n<100,下面n行是n组数据,每组数据由3个正整数组成,分别为年、月、日,我们保证每组数据都是有效的日期。

输出格式:

输出所输入的日期是这一年的第几天。

输入样例:

2
2009 1 1
2008 1 3

输出样例:

1
3
#include<stdio.h>
int main()
{
	int n, i, j;//设置嵌套循环
	int day, month, year;//输入日期
	int arr[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	scanf("%d",&n);//输入测试数据的组数
	for( i = 0 ; i < n ; i ++)
	{
		scanf("%d %d %d",&year,&month,&day)	;
		int sum = 0;//sum一定要在循环内部,方便清零🎃
		for( j = 1 ; j <= month ; j ++)
			sum += arr[j - 1];//不要加当月的天数
		if(year % 4 == 0 && month > 2)//闰年
			sum ++;
		if(year % 4 == 0 && month == 2 && arr[3] == 28)//闰年2月28的特判
			sum ++;
		sum += day;//加上当月的日期
		printf("%d\n",sum);
	}
	return 0;
}//❤

7-7 去掉重复的数据

在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。

你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,去掉所有重复的数字。最后按照输入顺序输出没有重复数字的数据。所有重复的数字只保留第一次出现的那份。

输入格式:

你的程序首先会读到一个正整数 n,1≤n≤100000。
然后是 n 个整数,这些整数的范围是 [1, 100000]。

输出格式:

在一行中按照输入顺序输出去除重复之后的数据。每两个数据之间有一个空格,行首尾不得有多余空格。

输入样例:

5
1 2 2 1 4

输出样例:

1 2 4
#include<stdio.h>
int main() {
	int bucket[100010] = {0};//定义一个桶🆒,并清零
	int n,temp;
	int i = 0;//设i的初值为0
	scanf("%d\n",&n);//输入要待测数据的个数
	scanf("%d",&temp);
	printf("%d",temp);
	bucket[temp]++;
/*值得说明一点,在c里的输入和输出,不考虑代码内的顺序
这里printf的temp,不会直接显示,会在后面的循环输入
结束之后跟后续的printf一同显示❤🎃*/ 
	while(i<n) 
	{
		scanf("%d",&temp);//先输入temp 
		if(bucket[temp]==0) //此时bucket[temp]==0 
		{
			printf(" %d",temp);
			bucket[temp] ++;//给桶标记,不再输出该数字 
		}
		i++;
	}
//前面单独拿出一个scanf和printf去单独输入输出第一组数据是为了
//保证后续的格式正确 ❤
	return 0;
}

7-8 求一批整数中出现最多的个位数字

给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。

输入格式:

输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。

输出格式:

在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n1、n2、……为出现次数最多的个位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。

输入样例:

3
1234 2345 3456

输出样例:

3: 3 4
#include<stdio.h>
int main() {
	int arr[10] = {0};
	int i, j, n, num,k;
	scanf("%d",&n);//待测试的组数
	for( i = 0 ; i < n ; i ++) {
		scanf("%d",&num);
		if(num == 0) {
			arr[0] ++;
		}//考虑是0的情况 
		while(num) {
			arr[num%10] ++;
			num /= 10;
		}//考虑非0的情况 
	}
	int max = 0;//打擂台的想法 
	for( j = 0 ; j < 10 ; j ++)
	 {//明白这个输出的含义,去拿最值跟桶比,而不是跟桶里的元素 
		if(max < arr[j]) //总共10个数字,只需要循环10次 
			max = arr[j];
	}
	printf("%d:",max);
	for( k = 0 ; k < 10 ; k ++) 
	{//如果有某个桶的里面元素个数等于最大值,那这个元素 
		if(arr[k] == max)//就是出现次数最多的(不一定是一个) 😶
			printf(" %d",k);
	}
	return 0;
}

7-9 sdut-C语言实验- 排序

给你N(N<=100)个数,请你按照从小到大的顺序输出。

输入格式:

输入数据第一行是一个正整数N,第二行有N个整数。

输出格式:

输出一行,从小到大输出这N个数,中间用空格隔开。

输入样例:

5
1 4 3 2 5

输出样例:

1 2 3 4 5
#include<stdio.h>
///选择排序
int main()
{
	int n, number, i, j;
	int arr[101];
	scanf("%d\n",&n);//表示输入n个元素
	for( i = 0 ; i < n ; i ++)
	{
		scanf("%d",&arr[i]);
	 } 
	 for( i = 0 ; i < n ; i ++)
	 {
	 	for( j = i + 1 ; j < n ; j ++)
	 	{
	 		if(arr[i] > arr[j])
	 		{
	 			int item = arr[i];
	 			arr[i] = arr[j];
	 			arr[j] = item;
			 }
		 }
	 }
	 printf("%d",arr[0]);
	 for( i = 1 ; i < n ; i ++)
	 {
	 	printf(" %d",arr[i]);
	 }
	 return 0;
}
#include<stdio.h>
/冒泡排序
int main()
{
	int n, number, i, j;
	int arr[101];
	scanf("%d\n",&n);//输入待排序数据个数 
	for( i = 0 ; i < n ; i ++)
	{
		scanf("%d",&arr[i]); //输入待排序数据 
	 } 
	 for( i = 0 ; i < n - 1 ; i ++)
	 {///n个数,每排好一个数字要进行n-1次 
	 	for( j = 0 ; j < (n - 1) - i ; j ++)
					/*注意这里的(n-1)-i的含义是: 
					j对应i的下标,再减掉以及排完序的i个 元素*/
	 				if(arr[j]>arr[j+1])
					 {
					 	int item = arr[j];
					 	arr[j] = arr[j+1];
					 	arr[j+1] = item;
					  } //交换大小,保证升序 🐱🐱
				}
	 printf("%d",arr[0]);
	 for( i = 1 ; i < n ; i ++)
	 {
	 	printf(" %d",arr[i]);
	 }
	 return 0;
}

7-10 sdut-C语言实验-排序问题

输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。

输入格式:

输入数据有一行,包含10个整数,用空格分开。

输出格式:

输出数据有两行,第一行为排序后的序列,第二行为排序后各个元素在原来序列中的位置。

输入样例:

1 2 3 5 4 6 8 9 10 7

输出样例:

在这里给出相应的输出。例如:

1 2 3 4 5 6 7 8 9 10
1 2 3 5 4 6 10 7 8 9
#include<stdio.h>
int main()
{
	int arr[11];//数组arr用来输入元素 
	int flag[11] = {1,2,3,4,5,6,7,8,9,10};//用来标记位置 
	int i, j;
	for( i = 0 ; i < 10 ; i ++)
	{
		scanf("%d",&arr[i]);//输入待排序元素 
	}
	for( i = 0 ; i < 10 ; i ++)
	{//正常写一个排序(选择排序) 
		for( j = i + 1 ; j < 10 ; j ++)
		{
			if(arr[i] > arr[j])
			{
				int item = arr[i];
				arr[i] = arr[j];
				arr[j] = item;
//至此完成了元素本身的排序///
				item = flag[i];
				flag[i] = flag[j];
				flag[j] = item;
/完成对标志本身的还原/// 
			}
		}
	}
在对两个数组进行两行的循环输出
	printf("%d",arr[0]);
	for( i = 1 ; i < 10 ; i ++)
	{
		printf(" %d",arr[i]);
	 }//输出排序后的元素 
	 
	 printf("\n");//换行
 
	 printf("%d",flag[0]);
	for( i = 1 ; i < 10 ; i ++)
	{
		printf(" %d",flag[i]);
	}//输出原来的位置 
	return 0;
}

7-11 sdut-C语言实验- 数列有序!

有n(n<=100)个整数,已经按照从大到小顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。

输入格式:

输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0表示输入数据的结束,本行不做处理。

输出格式:

对于每个测试实例,输出插入新的元素后的数列。

输入样例:

3 3
4 2 1
0 0

输出样例:

在这里给出相应的输出。例如:

4 3 2 1
#include<stdio.h>
int main()
{
	int n, m, i, j;
	int arr[101];
	while(scanf("%d %d",&n,&m) != EOF)
	{
	
	if(n == 0 && m == 0)
	return 0;
	else
	{
		for( i = 0 ; i < n ; i ++)
		{
			scanf("%d",&arr[i]);
		}
		arr[n] = m;//将m作为数组其中的一个值,插入到数组内部 
		for( i = 0 ; i < n ; i ++)
		{
			for( j = i + 1 ; j <= n ; j ++)
			{//因为上面取到了n的值,所以这里也是闭区间 
				if(arr[i]<arr[j])
				{
				int item = arr[i];
					arr[i] = arr[j];
					arr[j] = item;
				}//带着arr[n]进行排序 
			}
		}
		for( i = 0 ; i <= n ; i ++)//注意这里要考虑n 
		{
			if(i == 0)
				printf("%d",arr[0]);
			else
				printf(" %d",arr[i]);
		}
	}
	printf("\n");//自动换行,测试下一组 ✌🙆‍
}
return 0;
}

7-12 sdut-C语言实验- 中位数

中位数是指在一组数据中,按数值大小排序后处于中间位置的数。例如:1, 5, 3 排序后为 1, 3, 5,则其中位数为 3。特别地,当数的个数 N 为偶数时,中位数取位置居中的两个数 (N/2 和 N/2+1) 的平均值,例如:1, 2, 3, 4,中位数为 (2+3)/2 = 2.5。

给定一组数,你能求出中位数吗?

输入格式:

输入数据有多组(数据组数不超过 100),到 EOF 结束。

对于每组数据:

第 1 行输入一个整数 n (3 <= n <= 100),表示数的个数。
第 2 行输入 n 个用空格隔开的整数 Ai (0 <= Ai <= 1000),依次表示每一个数,保证互不重复。

输出格式:

对于每组数据,在一行中输出一个实数(保留 1 位小数),表示这组数据的中位数。

输入样例:

在这里给出一组输入。例如:

3
1 5 3
4
1 2 3 4

输出样例:

在这里给出相应的输出。例如:

3.0
2.5
#include <stdio.h>
int main()
{
    int i,j,t,n;
    double m;//注意题目的要求
    while (scanf("%d",&n)!=EOF)
    {
        int arr[n];
        for (i = 0 ; i < n ; i ++)
        {
            scanf("%d",&arr[i]);
        }
        for (i = 0 ; i < n - 1 ; i ++)
        {
            for(j = 0; j < n - 1 - i ; j ++)
            {//冒泡排序
                if(arr[j] > arr[j+1])
                {
                    t = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = t;
                }
            }
        }//正常完成排序,从而方便后续找到中位数?
                /*如 输入: 7   6   3   5   2   7
			       2   3   5   6   7   7   
         对应的下标 [0] [1] [2] [3] [4] [5]   
		这里n=6是奇数			   	    */
        if (n % 2 == 0)
        {//一共有偶数个元素
            m = (arr[(n/2)-1]+arr[(n/2)])/2.0;
            //这里要加2.0是因为,double和.1lf只会整除保留.0
            /*注意这里的数组是从0开始,这里n % 2 == 0则是表示的偶数,但是
        从0开始,奇数里是也是从0开始(n+1)/ 2 - 1*/
            printf("%.1lf",m);
        }
        else
        {//一共有奇数个元素
            m = arr[(n+1)/2 - 1 ];//就是中间那个?
//关键,这里arr[]是int型,所以后面不能有arr[(n+a)/2.0-1]的形式,会报编译错误
//奇数的中位数就不用考虑后面的位,因为单个数字都是.0⭐⭐
            printf("%.1lf",m);
        }
        printf("\n");
    }
    return 0;
}

7-13 sdut-C语言实验-各位数字之和排序

给定n个正整数,根据各位数字之和从小到大进行排序。

输入格式:

输入数据有多组,每组数据占一行,每行的第一个数正整数n,表示整数个数,后面接n个正整数。当n为0时,不作任何处理,输入结束。n<=10。

输出格式:

输出每组排序的结果。

输入样例:

3 230 59 110
5 199 220 108 235 120
0

输出样例:

在这里给出相应的输出。例如:

110 230 59
120 220 108 235 199
#include<stdio.h>
int main() {
	int n, number, i, j;
	int arr[100010];
	while(scanf("%d",&n) != EOF) 
	{
        int sum[100010] = {0};//一定要在内部定义,每次一都是重新使用⭐⭐
		if(n == 0)
		return 0;
		for( i = 0 ; i < n ; i ++)
		 {
			scanf("%d",&arr[i]);
			int temp = arr[i];
			while(temp) 
			{
				sum[i] += temp % 10;
				temp /= 10;
			}
		}
		/*              arr[]里面     110		59		235
						sum[]里面     2			14		10

					→→→现在想让sum[1]跟sum[2]交换,但是最终打印出来的
						是arr[1]和arr[2],所以,用sum[]的大小作为条件,将
						arr[]换掉(注意:这里也要将sum[]本身给交换,因为
						方便后续再进行arr[]的交换)

		*/
		for( i = 0 ; i < n ; i ++)
			for( j = i + 1 ; j < n ; j ++) {
				if(sum[i] > sum[j]) {
				 int item = sum[i];
					sum[i] = sum[j];
					sum[j] = item;
					 item = arr[i];
					arr[i] = arr[j];
					arr[j] = item;
					
				}
			}
		printf("%d",arr[0]);
		for( i = 1 ; i < n ; i ++)
			printf(" %d",arr[i]);
	printf("\n");
	}
	return 0;
}

7-14 sdut-C语言实验- 冒泡排序中数据交换的次数

听说过冒泡排序么?一种很暴力的排序方法。今天我们不希望你用它来排序,而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。

输入格式:

输入数据的第一行为一个正整数 T ,表示有 T 组测试数据。
接下来T行,每行第一个整数N, 然后有N个整数,无序。0<N <= 100

输出格式:

输出共 T 行。
每行一个整数,代表本行数据从小到大冒泡排序所进行的交换次数

输入样例:

在这里给出一组输入。例如:

3
5 1 2 3 4 5
4 5 3 7 1
2 2 1

输出样例:

在这里给出相应的输出。例如:

0
4
1
#include<stdio.h>
int main()
{
	int n, i, j, temp, T;
	int arr[101];
	scanf("%d",&T);
	while(T)
	{
		int cnt = 0;//在内部定义
		scanf("%d",&n);
		for( i = 0 ; i < n ; i ++)
		{
			scanf("%d",&arr[i]);
		}
		for( i = 0 ; i < n - 1 ; i ++)
		{
			for( j = i + 1; j < n  ; j ++)
			{
				if(arr[i] > arr[j])
				{
					temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp; 
					cnt ++;//计数器
				}
			}
		}
		printf("%d\n",cnt);
		T--;
	}
}

7-15 冒泡法排序之过程

输入格式:

输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。

输出格式:

在每一行中输出排序过程中对应步骤的中间结果,即每一步后a[0]〜 a[n−1]的值,相邻数字间有一个空格,行末不得有多余空格。

输入样例:

5
8 7 6 0 1

输出样例:

7 6 0 1 8
6 0 1 7 8
0 1 6 7 8
0 1 6 7 8
#include<stdio.h>
int main() {
	int n, i, j, temp, k;
	int arr[101];
	scanf("%d",&n);
	for( i = 0 ; i < n ; i ++)
		scanf("%d",&arr[i]);
	for( i = 0 ; i < n - 1 ; i ++) {
		for( j = 0 ; j < n - 1 - i ; j ++) {
			if (arr[j] > arr[j + 1]) {
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		printf("%d", arr[0]);
		for( k = 1 ; k < n ; k ++)
			printf(" %d",arr[k]);
		printf("\n");//每次打印要在外层循环内部
	}
	if(n == 1)//别忘记n==1的特判
	printf("%d",arr[0]);
	return 0;
}

7-16 选择法排序之过程

输入格式:

输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。

输出格式:

在每一行中输出排序过程中对应步骤的中间结果,即每一步后a[0]〜 a[n−1]的值,相邻数字间有一个空格,行末不得有多余空格。

输入样例:

4
5 1 7 6

输出样例:

1 5 7 6
1 5 7 6
1 5 6 7

这个题有一个点过不去,但是大体思路是对待,可能少考虑了情况,改天再看看 

#include<stdio.h>
int main () {
	int arr[100],i,n,temp,j;
	scanf("%d\n",&n);
	for(i=0; i<n; i++) {
		scanf("%d",&arr[i]);
	}
	if(n==1) {
		printf("%d",arr[0]);
		return 0;
	}
	for(i = 0 ; i < n - 1 ; i ++) {
		for( j = i + 1 ; j < n ; j ++)
			if(arr[i] > arr[j]) 
			{
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		for(j = 0 ; j < n ; j ++) {
			if(j == 0)
				printf("%d",arr[j]);
			else
				printf(" %d",arr[j]);
			if(j == n - 1 )
				printf("\n",arr[j]);
		}
	}
	return 0;
}

 

7-17 sdut- C语言实验-数组逆序(数组移位)

有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m < n < 100)个位置。

输入格式:

输入数据有2行,第一行的第一个数为n,后面是n个整数,第二行整数m。

输出格式:

按先后顺序输出n个整数。

输入样例:

5 1 2 3 4 5
2

输出样例:

在这里给出相应的输出。例如:

4 5 1 2 3
#include<stdio.h>
int main()
{
	int n, m, i, j;
	int arr[101];
	scanf("%d\n",&n);
	for( i = 0 ; i < n ; i ++)
		scanf("%d",&arr[i]);//循环输入数据 
	scanf("%d",&m);
	for( i = 0 ; i < m ; i ++)
	{
		int temp = arr[n-1];//预先存起最后一个元素的值 
		for( j = n - 1 ; j > 0 ; j --)//整体向后位移 
			arr[j] = arr[j-1];
		arr[0] = temp;//最后一个元素装进第一个 
    }
//	数组位移的过程EX:
//前:			1		2		3		4		5      令temp = a[n-1](a[4]) 
//				a[0]    a[1]    a[2]    a[3]    a[4]
//				
//		        1    	1		2		3		4		(temp = 5)     
//				a[0]    a[1]    a[2]    a[3]    a[4]	整体后移 
//				
//				5(temp)	2		3		4		4		arr[0] = temp
//				a[0]    a[1]    a[2]    a[3]    a[4]
//				
//				至此完成一次数组位移,在把这个过程放入一个大的循环,进行m次 
		printf("%d",arr[0]);
		for( j = 1 ; j < n ; j ++)
			printf(" %d",arr[j]);
			printf("\n");
	return 0;
}

7-18 sdut-C语言实验-矩阵输出(数组移位)

输入N个整数,输出由这些整数组成的n行矩阵。

输入格式:

第一行输入一个正整数N(N<=20),表示后面要输入的整数个数。
下面依次输入N个整数。

输出格式:

以输入的整数为基础,输出有规律的N行数据。

输入样例:

在这里给出一组输入。例如:

5
3 6 2 5 8

输出样例:

在这里给出相应的输出。例如:

3 6 2 5 8
8 3 6 2 5
5 8 3 6 2
2 5 8 3 6
6 2 5 8 3

 

#include<stdio.h>
int main() {
	int n, m, i, j;
	int arr[101];
	scanf("%d\n",&n);
	for( i = 0 ; i < n ; i ++)
		scanf("%d",&arr[i]);//循环输入数据
	scanf("%d",&m);
//\\\\\\\\\\\\\\\\\\\\\预先输出一次原来的数据
	printf("%d",arr[0]);
	for( j = 1 ; j < n ; j ++)
		printf(" %d",arr[j]);
	printf("\n");
//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\数组位移
	for( i = 0 ; i < n - 1 ; i ++) {
		int temp = arr[n-1];//预先存起最后一个元素的值
		for( j = n - 1 ; j > 0 ; j --)//整体向后位移
			arr[j] = arr[j-1];
		arr[0] = temp;//最后一个元素装进第一个
//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\将每次位移结果打印
		printf("%d",arr[0]);
		for( j = 1 ; j < n  ; j ++)
			printf(" %d",arr[j]);
		printf("\n");
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值