数组练习
// // main.c // 数组练习 // // Created by zhangxueming on 15/6/2. // Copyright (c) 2015年 zhangxueming. All rights reserved. // #include <stdio.h> //#include <stdbool.h> //7.计算某个由英文、数字以及标点符号构成的数组的总宽度,其中英文字符的宽度为 //1cm,数字宽度为 0.5cm、标点符号宽度为 0.8cm。 //8.接上题,如果规定行的宽度为 10cm,将某个字符长度超过 50 的字符串截断,恰好 使 10cm 宽的行能容纳。输出这个被截断的子数组。 //rtyuiopgfdfgj\0fghjklkjh float getCharacterWidth(char ch) { if ((ch>='A' && ch<='Z') || (ch>='a' && ch<='z')) { return 1.0; } else if(ch>='0' && ch<='9') { return 0.5; } else { return 0.8; } } //int main(int argc, const char * argv[]) { // char str[100]={}; // int cnt =0; // float length = 0.0; // // for (int i=0; i<100; i++) { // scanf("%c",&str[i]); // if (str[i]=='\n') { // str[i]='\0'; // break; // } // cnt++; // } // int i=0; // for (; i<cnt; i++) { // length+= getCharacterWidth(str[i]); // if (length>10.0) { // str[i]='\0'; // break; // } // } // //// for (int j=0; j<i; j++) { //// printf("%c", str[j]); //// } // printf("%s\n", str); // return 0; //} //13.给定一个 5 个元素构成的整型数组,每个元素的值都在 0-9 之间,按照位置将其组成一个 5 位数并输出,例如 int a[5] = {1,2,2,3,7};则输出 73221。 //num = 7 //num*10+3 = 73 //num*10+2 = 732 //num*10+2 = 7322 //num*10+1 = 73221 //int main(int argc,const char *argv[]) //{ // int a[5]={}; // int num = 0; // for (int i=0; i<5; i++) { // scanf("%d", &a[i]); // } // for (int i=4; i>=0; i--) { // num = num*10+a[i]; // } // printf("num = %d\n", num); // return 0; //} //18.判断一个整型数组是否是对称数组,例如a[6]={1,2,3,3,2,1}和{1,6,8,1,8,6,1}都是对称数组。 typedef enum { false,//0 true //1 }bool; bool isSymmetryArray(int a[], int len) { for (int i=0; i<len/2; i++) { if (a[i]!=a[len-i-1]) { return false; } } return true; } //int main(int argc,const char *argv[]) //{ // int a[6]={1,2,3,3,2,1}; // printf("%d\n", isSymmetryArray(a,6)); // return 0; //} //30.给定一个英文句子,单词之间用 1 个空格分开,求出第 2 个单词的偏移位置。例如 //“Professor du comes from Korea”的偏移位置是 10。 //int main(int argc,const char *argv[]) //{ // char str[100]={}; // scanf("%[^\n]", str); // //scanf("%[A-Z,a-z,0-9]",str); // //printf("%s", str); // int i=0; // while (str[i]) { // if (str[i]==' ') { // break; // } // i++; // } // printf("%d",i+1); // // return 0; //} //43.围圈报数 //有n个人围成一圈,顺序排号。从第一个人开始报数(从1到m报数),凡报到m的人退出圈子,问最后留下的是原来第几号的哪位. //0 0 0 1 0 3 //int main(int argc,const char *argv[]) //{ // int a[100]={}; // int n,m; // int cnt=0;//统计出局的人数 // int k=0;//报数 // int i=0; // scanf("%d%d", &n, &m); // if (n<0||n>100) { // return -1; // } // // for (i=0; i<n; i++) { // a[i]=1; // } // i=0; // while (cnt<n-1) { // if (a[i]) { // k++; // if(k==m) // { // a[i]=0; // k=0; // cnt++; // } // } // i++; // if (i==n) {//判断边界 // i=0; // } // } // for (i=0; i<n; i++) { // if (a[i]) { // printf("%d", i+1); // break; // } // } // return 0; //} //猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 //10 1 //9 (1+1)*2 4 //8 (4+1)*2 10 int func(int n) { if (n==10) { return 1; } else if(n>10) { return 0; } return (func(n+1)+1)*2; } //int main(int argc, const char *argv[]) //{ // // printf("%d\n", func(8)); // // return 0; //} //4..输入10个数,找出出现次数最多的数 (如果多个并列,则按数字出现顺序分别输出) //比如:a[10]= //输入:1 2 2 3 4 5 6 7 8 9 //输出:2 //数据结构: 定义一个整型数组 int count[10] 存储每个元素的个数, 开始时每个元素个数初始化为1 // //算法: //(1) 利用双层循环, 每一个元素都与后面一个元素比较, 如果两者相同, 则该元素次数+1, //(2) 以上的算法中两个相同的元素的次数是一样的, 优化如下, 比较两个元素的时候, 如果两者相等, 则该元素次数+1, 后面的元素次数设置为0, 比较的时候再判断这个元素是否已经比较 // //伪代码: // //定义数组保存每个元素次数 // //使用双层循环遍历数组 //如果当前元素后后面元素相等, 并且后面的元素次数不为0 //当前元素次数+1, 后面的元素次数设置为0 // //从保存每个元素次数的数组中查找最大的值 //a[10]= //1 2 2 5 4 5 2 7 5 9 //count[10] //1 3 0 2 1 0 0 1 1 1 int main(int argc,const char *argv[]) { int a[10]={}; int cnt[10]={}; for (int i=0; i<10; i++) { scanf("%d", &a[i]); } for (int i=0;i<10; i++) { cnt[i]=1; } for (int i=0; i<10; i++) { if (cnt[i]) { for (int j=i+1; j<10; j++) { if (a[i]==a[j]) { cnt[i]++; cnt[j]=0; } } } } // for (int i=0; i<10; i++) { // printf("%d ", cnt[i]); // } //查找cnt数组中的最大值 int max = cnt[0]; for (int i=1; i<10; i++) { if (max<cnt[i]) { max = cnt[i]; } } //输出数值 for (int i=0; i<10; i++) { if (max==cnt[i]) { printf("%d ", a[i]); } } return 0; }