数组练习

//
//  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;
}

 

posted @ 2015-06-02 17:51  sirzhang  阅读(130)  评论(0编辑  收藏  举报
AmazingCounters.com