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找出其中重复的数,重复次数。
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); } }
时间: 2024-10-05 09:35:11