1).求一个数组中的第二大值.数组中的值范围10 - 30 ,存储空间大小为10.
代码如下:
int a[10] = {0};
int max = 0, secMax = 0; //定义第一大值,第二大值.
for (int i = 0; i< 10; i++) {
a[i] = arc4random() %(30 - 10 + 1) + 10;//随机值 10-30
printf("a[%d] = %d\n" ,i ,a[i]);
}
for (int i = 0 ; i < 10; i++) {
if (max < a[i]) {
secMax = max ; //先将手中的第二大值给 secMax.然后在保存当前最大值.
max = a[i];
} else if (a[i] > secMax && max != a[i]) { //为了不出现 max= 30 ,sexMax =30 现象. 即 a[i] < secMax < max
secMax = a[i]; //如果当前值比sexMax要大,比max小,则是第二大值.
}
}
printf("max = %d,sexMax = %d \n" ,max ,secMax);
2.)随机产生20 个10~50的正整数存放到数组中,并求数组中的多有元素最大值、最小值、平均值及各元素之和。
代码如下:
int m[20] = {0};
for (int i = 0; i < 20; i++) {
m[i] = arc4random() % (50 - 10 + 1) + 10;
printf("%d\n", m[i]);
}
int max = 0, min = 0 , sum = 0; float avg = 0;
//最大值
for (int i = 0; i < 20; i++) {
if (max < m[i]) {
max = m[i];
}
}
printf("max = %d\n", max);
//最小值
for (int i = 0; i < 20; i++) {
if ( i == 0) {
min = m[i];
} else {
if (min > m[i]) {
min = m[i];
}
}
}
printf("min = %d\n", min);
//和
for (int i = 0; i < 20; i++) {
sum += m[i];
}
printf("sum = %d\n", sum);
//平均数
avg = sum / 20;
printf("avg = %.2f\n",avg);
3).将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的(归并排序)。
//定义两个数组m,n
int m[10] = {0};
int n[10] = {0};
//给数组赋值,随机值范围[20,40]之间
for (int i = 0; i < 10; i++) {
m[i] = arc4random() % (40 - 20 + 1) + 20;
n[i] = arc4random() % (40 - 20 + 1) + 20;
}
//对数组m升序排列
for (int i = 0; i < 10 - 1; i++) {
for (int j = 0; j < 10 - i - 1; j++) {
if (m[j] > m[j+1]) {
int temp = m[j];
m[j] = m[j+1];
m[j+1] = temp;
}
}
}
//对数组n升序排列
for (int i = 0; i < 10 - 1; i++) {
for (int j = 0; j < 10 - i - 1; j++) {
if (n[j] > n[j+1]) {
int temp = n[j];
n[j] = n[j+1];
n[j+1] = temp;
}
}
}
//排序后打印结果
for (int i = 0; i < 10 ; i++) {
printf("m[%d] = %d,n[%d] = %d \n", i, m[i], i, n[i]);
}
int c[10] ={0};//定义第三个数组.两个数组合并.归并排序
int k = 0, i = 0, j = 0;
while (i < 10 && j < 10 ) {
if (a[i] < b[j]) {
c[k++] = a[i++];
} else {
c[k++] = b[j++];
}
}
while(i < 10){
c[k++] = a[i++];
}
while (j < 10) {
c[k++] = b[j++];
}
for (int i = 0; i< 10; i++) {
printf("%d\n",c[i]); //输出结果
}
4).在一个已知的字符串中,查找最长单词,并且输出最长单词.
char str[] = "name is a mk fuckd is fucshish";
int len = 0;//存储当前单词的长度
int max = 0;//存储最长单词的长度
int maxIndex = 0;//存储最长单词的位置
int i = 0;//循环变量初始值
while (str[i] != '\0') {
if (str[i] != ' ') {
//如果去到的字符不是空格
len++;
} else {
//获取到的是字符是空格.
if (len > max) {
max = len;
maxIndex = i - len;
}
len = 0;//将单词长度清零,计算新的单词.
}
i++;
}
//如果最后一个单词是最长单词,不会遇到空格,则不会和maxLength 比较.所以我们只需要在循环外部比较一次即可.
if (len > max) {
max = len;
maxIndex = i - len;
}
for (int i = maxIndex; i < maxIndex + max ; i++) {
printf("%c",str[i]);//最长单词
}
5).耶稣有13个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个开始报号:1,2,3,1,2,3...。凡是报到“3”就退出圈子,最后留在圈子内的人就是出卖耶稣的叛徒。请找出它原来的序号。
思路:
1.如何描述13个人? 定义数组
2.如何报数? 定义变量 count记录报数
3.一旦报数为3,做什么处理?
4.如何剔除一个人? 将该元素置0
5.表示当前或者的人数? 定义变量number;
6.因为不确定循环次数,用whlie循环 循环条件 number > 1
7.如何循环报数? 如果 i = 13 ,就转到第一个人继续报数.
代码如下:
int arr[13] ={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int count = 0, number = 13,i = 0 ;
while (number > 1) {
if (arr[i] != 0) {
count++;
if (count == 3) {
arr[i] = 0;
number--;
count = 0;
}
}
i++;
if (i == 13) { //下标
i = 0;//及第一个个人
}
}
//对数组遍历,找到活着的人
for ( int i = 0; i < 13; i++) {
if (arr[i] != 0) {
printf("当前活着的人:%d\n",arr[i]);
}
}
6),有1000000个数,每个数取值范围是0-999999找出其中重复的数,重复次数。
//方法1:在0-9中选取10个数,在10- 19中选取10个数.
int a[10] = {0}; //0-9或者10 - 1 9之间 10个数
int num = 0; //接受每次的随机值
for (int i = 0; i < 10; i++) {
num = arc4random() % (19 - 10 + 1) +10; //num = arc4random() % 10;
printf("%d ",num);
a[num - 10]++;//将下标对应元素值加1.
}
printf("\n");
for (int i = 0; i < 10; i++) {
if (a[i] > 1) {
printf("%d 重复 %d次\n", i + 10, a[i] );
}
}
//取值范围17 - 19之间 的10个数
int b[3] = {};//对应获取到的值为3个 17,18,19
int num1 = 0;
for (int i = 0; i < 10; i++) {
num1 = arc4random() % (19 -17 + 1) +17;
printf("%d ",num1);
b[num1 - 17]++; // num - 17 范围为 0,1,2,下标
}
for (int i = 0; i < 3; i++) { //打印这3个个数
if (b[i] > 1) {
printf("%d 重复 %d次\n", i + 17, b[i] );
}
}
//30 - 50之间 20个数
int c[21] = {};
int num2 = 0;
for (int i = 0; i < 20; i++) {
num2 = arc4random() % (50 - 30 + 1) + 30;
printf("%d ",num2);
c[num2 - 30]++; 0 <= num2 - 30 <= 20
}
for (int i = 0; i < 21; i++) { //30 -50之间有21个数,遍历本身,让本身自己计数.
if (c[i] > 1) {
printf("%d 重复 %d次\n", i + 30, c[i]);
}
}
//方法2:这种效率太低,一般不用
int n[1000000];
for (int i = 0; i < 1000000; i++) {
//随机产生1000000个数,范围0-999999
n[i] = arc4random() % 999999 ;
printf("%d ", n[i]);
}
printf("\n");
int count = 0; int temp = 0;
for (int i = 0; i < 1000000; i++) {
count = 0;
for (int j = i; j < 1000000 ; j++) {
if (n[i] == n[j] && i != j && n[i] != -1) {
count++;
temp = n[i];
n[j] = -1;
}
}
n[i] = -1;
if (count > 0) {
printf("重复数为:%d,重复次数为:%d\n",temp,count);
}
}