7-4 排序(选择法)
问题:从键盘输入10个数,编程将其按从大到小的顺序排列后再输出。(使用选择法)
#include <stdio.h>
int main()
{
int i, j, temp;
int a[10] = {};
for(i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
for(i = 0; i < 9; i++)
{
for(j = i + 1; j < 10; j++)
{
if(a[i] < a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for(i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
7-5 排序
问题:输入一批未排序的数据,数量不超过30个,请使用选择法或者冒泡法对其排序,并按照规定的要求输出。
#include <stdio.h>
int main()
{
int n, i, j, temp;
int a[30] = {};
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for(i = 0; i < n - 1; i++)
{
for(j = i + 1; j < n; j++)
{
if(a[i] < a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for(i = 0; i < n - 1; i++)
{
printf("%d ", a[i]);
}
printf("%d", a[n - 1]);
return 0;
}
7-6 输出数组中最大值出现的次数
问题:定义长度为N的数组,为每个元素存入0~20的之间的随机数,输出最大值出现的次数。
#include <stdio.h>
int main()
{
int n, i, count = 0;
int a[100] ={};
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
int max = a[0];
for(i = 1; i < n; i++)
{
if(max < a[i])
{
max = a[i];
}
}
for(i = 0; i < n; i++)
{
if(a[i] == max)
{
count++;
}
}
printf("最大值出现的次数为:%d\n", count);
return 0;
}
7-7 求一维数组中最小元素下标
问题:编写程序,求一维数组中最小元素下标。
#include <stdio.h>
int main()
{
int n, i, flag;
int a[100] = {};
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
int min = a[0];
if(min >= a[i])
{
min = a[i];
flag = i;
}
}
printf("数组中最小元素的下标为:%d\n", flag);
return 0;
}
7-8 存储0至N的阶乘并输出。
问题:定义长度为N+1的数组,存储0至N的阶乘,并输出。
#include <stdio.h>
int fact(int m)
{
int result = 1, i;
if(m == 0)
{
result = 1;
}
for(i = 1; i <= m; i++)
{
result = result * i;
}
return result;
}
int main()
{
int n, i, x;
scanf("%d", &n);
for(i = 0; i <= n; i++)
{
x = fact(i);
printf("%d的阶乘为:%d\n", i, x);
}
return 0;
}
7-9 统计输出各个季度过生日的人数
问题:定义长度为12的整型数组,将你所在班级每个月过生日的人数输入数组中相应元素(1月对应下标0,2月对应下标1,……,12月对应下标11),并统计输出各个季度过生日的人数。
#include <stdio.h>
int main()
{
int month[12] = {};
int i, q1 = 0, q2 = 0, q3 = 0, q4 = 0;
for(i = 0; i < 12; i++)
{
scanf("%d", &month[i]);
}
for(i = 0; i < 3; i++)
{
q1 = q1 + month[i];
}
for(i = 3; i < 6; i++)
{
q2 = q2 + month[i];
}
for(i = 6; i < 9; i++)
{
q3 = q3 + month[i];
}
for(i = 9; i < 12; i++)
{
q4 = q4 + month[i];
}
printf("第一季度生日的人数 = %d\n", q1);
printf("第二季度生日的人数 = %d\n", q2);
printf("第三季度生日的人数 = %d\n", q3);
printf("第四季度生日的人数 = %d\n", q4);
return 0;
}
7-10 使用数组存放斐波那契数列前40项,输出第38项和第39项的值,以及二者的商
问题:数列1、1、2、3、5、8、……被称为斐波那契数列,数列的第0项和第1项为1,第2项开始的每一项等于其前面两项之和。使用数组存放斐波那契数列前k项,输出第n项和第m项的值,以及二者的商。
#include <stdio.h>
int main()
{
int f[40] = {};
int i, k, n, m;
float quot;
scanf("%d %d %d", &k, &n, &m);
f[0] = f[1] = 1;
for(i = 2; i < k; i++)
{
f[i] = f[i - 2] + f[i - 1];
}
quot = 1.0 * f[n] / f[m];
printf("F(%d)=%d,F(%d)=%d\n", n, f[n], m, f[m]);
printf("黄金比例约等于:%.3f\n", quot);
return 0;
}
注意两个整数相除想要得到小数应该乘1.0
7-11 开关门
问题:宾馆里有n(2≤n≤1000)个房间,从1∼n编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”…,以后每个服务员都是如此。当第n个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)
#include <stdio.h>
int main()
{
int a[1000] = {};
int i, n, j;
scanf("%d", &n);
for(i = 0; i <= n; i++)
{
a[i] = -1;
}
for(j = 1; j <= n; j++)
{
for(i = 1; i <= n; i++)
{
if(i % j == 0)
{
a[i] = -a[i];
}
}
}
for(i = 0; i <= n; i++)
{
if(a[i] == 1)
{
printf("%d ", i);
}
}
printf("\n");
return 0;
}
7-12 逆序存放数组中的数据,并输出指定元素
问题:本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按要求输出指定的数组元素。
#include <stdio.h>
int main()
{
int a[10] = {};
int i, n, t, m;
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for(i = 0; i < n / 2; i++)
{
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
scanf("%d", &m);
printf("%d\n", a[m]);
return 0;
}
7-13 寻找202最帅
问题:
202宿舍有六位同学,他们对自己的颜值都无比自信,这是个没有结果的争论,正好前几天刚考完试,所以他们想以这次考试的成绩来找出202最帅的。你知道他们的规则和成绩,要求你用代码给出他们答案。
规则:班主任规定的优秀成绩为n分,如果6位同学的成绩全都超过优秀成绩,请输出“202 zui shuai”,如果6位同学的成绩全都低于优秀成绩,请输出“come on!”,如果6位同学的成绩有可能有高于优秀成绩的,有可能有低于优秀成绩的,有可能有等于优秀成绩的,请先输出“zui shuai”,再输出与优秀成绩最接近的同学的成绩,请输出此时所有高出优秀成绩的同学成绩,行末无多余空格。
#include <stdio.h>
int main()
{
int score[6] = {0};
int gap[6] = {0};
int n, i, min, a;
int all_greater = 1, all_lower = 1;
scanf("%d", &n);
for(i = 0; i < 6; i++)
{
scanf("%d", &score[i]);
if(score[i] <= n)
{
all_greater = 0; //(1)
}
if(score[i] >= n)
{
all_lower = 0;
}
}
if(all_greater == 1)
{
printf("202 zui shuai\n");
}
if(all_lower == 1)
{
printf("come on!\n");
}
if(all_greater == 0 && all_lower == 0)
{
printf("zui shuai\n");
min = 1000;
for(i = 0; i < 6; i++)
{
gap[i] = n - score[i];
if(gap[i] < 0)
{
gap[i] = -gap[i]; //(2)
}
if(min > gap[i])
{
min = gap[i];
a = score[i];
}
}
printf("%d\n", a); //(3)
int flag = 0;
for(i = 0; i < 6; i++)
{
if(score[i] > n)
{
if(flag == 1)
{
printf(" "); //(4)
}
printf("%d", score[i]);
flag = 1;
}
}
}
return 0;
}
注:
(1)数组中所有数大于某一个数或小于某一个数的写法
(2)对于比优秀分高的分数的差值不要忘了取相反数
(3)注意输出位置
(4)行末没有空格但是中间有空格的写法
7-14 数位分离
问题:输入一个正整数n,要求输出其位数,并分别以正序和逆序输出各位数字。
#include <stdio.h>
void reverse(int arr[], int size)
{
int i, temp;
for(i = 0; i < size / 2; i++)
{
temp = arr[i];
arr[i] = arr[size - i - 1];
arr[size - i - 1] = temp;
}
}
void devide(int a)
{
int count = 0, i;
int out[1000] = {};
while(a != 0)
{
count++;
out[count-1] = a % 10;
a = a / 10;
}
printf("%d", count);
reverse(out, count);
for(i = 0; i < count; i++)
{
printf(",%d", out[i]);
}
reverse(out, count);
for(i = 0; i < count; i++)
{
printf(",%d", out[i]);
}
printf("\n");
}
int main()
{
int T, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
devide(n);
}
return 0;
}
注意无返回值函数的引用
7-15 折半查找
问题:在一个有序的一维数组中,输入一个数,利用折半查找法找到该数是这个数组中的第几个数;如果该数不在数组中,则输出“No data!”
#include <stdio.h>
int main()
{
int i, n, x;
int a[15] = {};
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &x);
int left = 0, right = n - 1, mid;
while(left <= right)
{
mid = (left + right) / 2;
if(x == a[mid])
{
printf("It's position is %d!\n", mid + 1);
return 0;
}
else if(x < a[mid])
{
right = mid - 1;
}
else if(x > a[mid])
{
left = mid + 1;
}
}
printf("No data!\n");
return 0;
}
7-16 指定位置插入元素(数组)
#include<stdio.h>
int main(){
int a[51]={2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,0};
int x,k;
scanf("%d %d",&x,&k);
int i;
if(k<0||k>50) printf("error.");
else{
for(i=50;i>k;i--){
a[i]=a[i-1];
}
a[k]=x;
for(i=0;i<51;i++){
printf("%d ",a[i]);
}
}
return 0;
}
7-17 数组元素的删除
#include <stdio.h>
int main()
{
int n, k, x, i, j;
scanf("%d", &n);
int arr[n];
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
scanf("%d", &k);
for (i = 0; i < k; i++)
{
scanf("%d", &x);
for (j = x - 1; j < n - 1; j++)
{
arr[j] = arr[j+1];
}
n--;
}
for(i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
7-18 求最大数和它的下标, 并与a[0]对换位置
#include <stdio.h>
int main()
{
int a[10] = {};
int i, n, max = -100, t, index;
for(i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
for(i = 0; i < 10; i++)
{
if(max < a[i])
{
max = a[i];
index = i;
}
}
t = a[index];
a[index] = a[0];
a[0] = t;
for(i = 0; i < 10; i++)
{
printf("%4d", a[i]);
}
printf("\n");
printf("max=%d,weizhi=%d\n", max, index);
return 0;
}
7-19 将下标为偶数的元素值赋值给数组n
#include <stdio.h>
int main()
{
int m[10] = {}, n[5] = {};
int i, j;
for(i = 0; i < 10; i++)
{
scanf("%d", &m[i]);
}
for(i = 0; i < 10; i++)
{
if(i % 2 == 0)
{
j = i / 2;
n[j] = m[i];
}
}
for(i = 0; i < 5; i++)
{
printf("%4d", n[i]);
}
printf("\n");
return 0;
}