首页 > 代码库 > iOS-C_Day8___数组练习

iOS-C_Day8___数组练习

2015.1.28

3.给定某个拥有 5 个元素的字符数组,数组的成员都有阿拉伯字符构成,试着将该数

//组转换成一个整数,比如字符数组的内容是:{‘1’,’2’,’3’,’3’,’2’} 则将被转换成 12332。

//处理整形数组

/*int main(int argc, const char * argv[]) {

    int a[100];

    int cnt=0;

    int sum=0;

    for (int i=0; i<100; i++) {

        scanf("%d", &a[i]);

        cnt++;

        if (getchar()==‘\n‘) {

            break;

        }

    }

    

    for (int i=0; i<cnt; i++) {

        sum = sum*10+a[i];

    }

    printf("sum = %d\n", sum);

    

    return 0;

}*/

//处理字符数组

#if 0

int main(int argc, const char * argv[]) {

    char ch[100];

    int cnt=0;

    int sum=0;

    for (int i=0; i<100; i++) {

        scanf("%c", &ch[i]);

        if (ch[i]==‘\n‘) {

            ch[i]=‘\0‘;

            break;

        }

        cnt++;

    }

    

    for (int i=0; i<cnt; i++) {

        sum = sum*10+(ch[i]-‘0‘);

    }

    printf("sum = %d\n", sum);

    

    return 0;

}

#endif

 

//7.计算某个由英文、数字以及标点符号构成的数组的总宽度,其中英文字符的宽度为

//1cm,数字宽度为 0.5cm、标点符号宽度为 0.8cm。

//8.接上题,如果规定行的宽度为 10cm,将某个字符长度超过 50 的字符串截断,恰好 使 10cm 宽的行能容纳。输出这个被截断的子数组。

 

#include <string.h>

 

float judgeChar(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;

    }

}

 

#if 0

int main(int argc, const char *argv[])

{

    char str[100];

    float sum =0.00;

    scanf("%s", str);

    int len = (int)strlen(str);//求字符串有效字符个数,不包含‘\0‘;

    for (int i=0; i<len; i++) {

        sum+=judgeChar(str[i]);

    }

    printf("sum = %.2f\n", sum);

 

    return 0;

}

#endif

 

#if 0

int main(int argc,const char *argv[])

{

    char str[100];

    scanf("%s",str);

    int len = (int)strlen(str);

    float sum =0;

    for (int i=0; i<len; i++) {

        sum+=judgeChar(str[i]);

        if (sum>10) {

            str[i]=‘\0‘;

            break;

        }

        if (sum==10) {

            str[i+1]=‘\0‘;

            break;

        }

    }

    printf("str = %s\n", str);

    return 0;

}

 

#endif

 

//给定一个整型数组,数组的长度为 N(N>3),从数组中寻找一个连续的长度为 3 的子数组,要求该子数组的和最大。

 

#if 0

int main(int argc, const char *argv[])

{

    int a[100];

    int cnt=0;

    for (int i=0; i<100; i++) {

        scanf("%d", &a[i]);

        cnt++;

        if (getchar()==‘\n‘) {

            break;

        }

    }

    int max = a[0]+a[1]+a[2];

    for (int i=1; i<cnt-2; i++) {

        if (max<a[i]+a[i+1]+a[i+2]) {

            max = a[i]+a[i+1]+a[i+2];

        }

    }

    printf("max = %d\n", max);

 

    return 0;

}

#endif

 

//41.编写函数将一个n*n矩阵转置,例如:(****)

//1 2 3 4     1 5 3 4

//5 6 7 8 ->  2 6 2 7

//3 2 5 9     3 7 5 2

//4 7 2 3     4 8 9 3

 

//void reverseArr(int *a[], int n)

//{

//

//    return 0;

//}

 

#if  0

int main(int argc,const char *argv[])

{

    int a[4][4]={{1,2,3,4},

                 {5,6,7,8},

                 {3,2,5,9},

                 {4,7,2,3}};

    

    for (int i=0; i<4-1; i++) {

        for (int j=i+1; j<4; j++) {

            int temp = a[i][j];

            a[i][j]=a[j][i];

            a[j][i]=temp;

        }

    }

    for (int i=0; i<4; i++) {

        for (int j=0; j <4; j++) {

            printf("%d ", a[i][j]);

        }

        printf("\n");

    }

 

    return 0 ;

}

#endif

 

//猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

 

#if  0

int main(int argc,const char *argv[])

{

    int a[10]={};

    a[9]=1;

    for (int i=8; i>=0; i--) {

        a[i]=(a[i+1]+1)*2;

    }

    

    printf("%d ", a[0]);

 

    return 0;

}

#endif

//围圈报数

//有m个人围成一圈,顺序排号。从第一个人开始报数(从1到n报数),凡报到m的人退出圈子,问最后留下的是原来第几号的哪位。

 

//5 3  --> 4

//6 2  --> 5

 

//0 0 0 4 0

//

 

#if 0

int main(int argc, const char *argv[])

{

    int a[100];

    int m, n;

    int cnt = 0;//统计退出的人数

    scanf("%d %d", &m , &n);

    if (m<1||m>100 || n<1) {

        return -1;

    }

    int i=0;

    for (i=0; i<m; i++) {//给数组赋值

        a[i]=i+1;

    }

    int k=0;//报数

    i = 0;

    while (cnt<m-1) {

        if(a[i])

        {

            k++;

            if (k==n) {

                a[i]=0;

                k=0;

                cnt++;

            }

        }

        i++;

        if (i==m) {//边界处理

            i=0;

        }

    }

    for (int i=0; i<m; i++) {

        if (a[i]) {

            printf("%d", i+1);

        }

    }

    printf("\n");

    return 0;

}

#endif

 

//3.输入十个数,任意相邻的两个数不同,输出所有的递增,递减序列

//比如:

//输入:1 5 9 8 12 21 3 0 -1 9

//输出:

//1 5 9

//9 8

//8 12 21

//21 3 0 -1

//-1 9

//

//输入: 3 9 8 -11 4 21 8 -3 0 2

//输出:

//3 9

//9 8 -11

//-11 4 21

//21 8 -3

//-3 0 2

#if 0

int main(int argc,const char *argv[])

{

    int a[10]={};

    for (int i=0; i<10; i++) {

        scanf("%d", &a[i]);

    }

    

    printf("%d ", a[0]);

    for (int i=1; i<9; i++) {

        printf("%d ", a[i]);

        if ((a[i]>a[i-1] && a[i]>a[i+1]) || (a[i]<a[i-1] && a[i]<a[i+1])) {

            putchar(‘\n‘);

            printf("%d ", a[i]);

        }

    }

    printf("%d\n", a[9]);

 

 

    return 0;

}

#endif

 

//2. 输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限

//比如:

//输入:5 18

//输出:

//1  2  3  4  5

//16 17 18 0  6

//15 0  0  0  7

//14 0  0  0  8

//13 12 11 10 9

//

//输入: 4 12

//输出:

//1  2  3  4

//12 0  0  5

//11 0  0  6

//10 9  8  7

 

#if 0

int main(int argc, const char *argv[])

{

    int a[20][20]={};

    int m,n;

    scanf("%d%d", &n,&m);

    if (n<1 || m>n*n|| m<0) {

        return -1;

    }

    int s1=n-1, s2=n-1, s3=0, s4=1;//控制边界

    int i=0,j=0;//控制二维数组下标

    int type=1;//1:从左往右赋值, 2:从上往下赋值,3:从右往左赋值 4: 从下往上赋值

    int cnt=1;//表示赋值的数

    while (cnt<=m) {

        a[i][j]=cnt;//赋值

        switch (type) {

            case 1://从左往右赋值

                if (j==s1) {

                    type=2;

                    s1--;

                    i++;

                }

                else

                {

                    j++;

                }

                break;

            case 2://从上往下赋值

                if (i==s2) {

                    type =3;

                    s2--;

                    j--;

                }

                else

                {

                    i++;

                }

                break;

            case 3://从右往左赋值

                if (j==s3) {

                    type =4;

                    s3++;

                    i--;

                }

                else

                {

                    j--;

                }

                break;

            case 4://从下往上赋值

                if (i==s4) {

                    type =1;

                    s4++;

                    j++;

                }

                else

                {

                    i--;

                }

                break;

            default:

                break;

        }

        cnt++;

    }

    

    for (int i=0; i<n; i++) {

        for (int j=0; j<n; j++) {

            printf("%4d", a[i][j]);

        }

        printf("\n");

    }

 

    return 0;

}

#endif

 

//4..输入10个数,找出出现次数最多的数 (如果多个并列,则按数字出现顺序分别输出)

//比如:

//输入:1 2 2 3 2 5 5 7 8 9

//输出:2 5

//     1 3 0 1 0 2 0 1 1 1

//  max =2;

// 2 5

//数据结构: 定义一个整型数组 int count[10] 存储每个元素的个数, 开始时每个元素个数初始化为1

//

//算法:

//(1) 利用双层循环, 每一个元素都与后面一个元素比较, 如果两者相同, 则该元素次数+1,

//(2) 以上的算法中两个相同的元素的次数是一样的, 优化如下, 比较两个元素的时候, 如果两者相等, 则该元素次数+1, 后面的元素次数设置为0, 比较的时候再判断这个元素是否已经比较

//

//伪代码:

//

//定义数组保存每个元素次数

//

//使用双层循环遍历数组

//如果当前元素后后面元素相等, 并且后面的元素次数不为0

//当前元素次数+1, 后面的元素次数设置为0

//

//从保存每个元素次数的数组中查找最大的值

 

#if 0

int main(int argc,const char *argv[])

{

    int a[10]={};

    int count[10];

    for (int i=0; i<10; i++) {

        scanf("%d", &a[i]);

    }

    for (int i=0; i<10; i++) {

        count[i]=1;

    }

 

    for (int i=0; i<10; i++) {

        if (count[i]) {

            for (int j=i+1; j<10; j++) {

                if (a[i]==a[j] && count[j]) {

                    count[i]++;

                    count[j]=0;

                }

            }

        }

    }

    

//    for (int i=0; i<10; i++) {

//        printf("%d ", count[i]);

//    }

    //查找count最大值

    int max = count[0];

    for (int i=1; i<10; i++) {

        if (max<count[i]) {

            max = count[i];

        }

    }

    

    //输出出现最多次数的值

    

    for (int i=0; i<10; i++) {

        if (max == count[i]) {

            printf("%d ", a[i]);

        }

    }

    printf("\n");

    

    return 0;

}

#endif

 

//5.魔方阵是一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m^2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等。请编程实现输入m,输出m*m的魔方阵出来。

//比如:

//输入:3

//输出:

//6 1 8

//7 5 3

//2 9 4

//(1)将1放在第一行中间一列;

//(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数减1(例如上面的三阶魔方阵,5在4的上一行后一列);

//(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;

//(4)当上一个数的列数为1时,下一个数的列数应为n,行数减去1。例如2在第3行 第一列,则3应放在第二行最后一列;

//(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;

int main(int argc,const char *argv[])

{

    int a[19][19]={};

    int m;

    scanf("%d", &m);

    if (!(m%2) || m<3 ||m>19) {

        return -1;

    }

    int i=0,j=m/2;

    int cnt =1;

    int temi,temj;

    while (cnt<=m*m) {

        a[i][j]=cnt;

        temi = i;//保存上一个数的下标

        temj = j;

        i--;//变换下标

        j--;

        if(temi==0)//变换行标

        {

            i = m-1;

        }

        if (temj==0)//变换列标

        {

            j = m-1;

        }

        if(a[i][j])

        {

            i = temi+1;

            j = temj;

        }

        cnt++;

    }

 

    for (int i=0; i<m; i++) {

        for (int j=0; j<m; j++) {

            printf("%4d", a[i][j]);

        }

        printf("\n");

    }

    return 0;

}

iOS-C_Day8___数组练习