zoukankan      html  css  js  c++  java
  • 数组练习

     

    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()==' ') {

                break;

            }

        }

        

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

            sum = sum*10+a[i];

        }

        printf("sum = %d ", 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]==' ') {

                ch[i]='';

                break;

            }

            cnt++;

        }

        

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

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

        }

        printf("sum = %d ", 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);//求字符串有效字符个数,不包含'';

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

            sum+=judgeChar(str[i]);

        }

        printf("sum = %.2f ", 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]='';

                break;

            }

            if (sum==10) {

                str[i+1]='';

                break;

            }

        }

        printf("str = %s ", 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()==' ') {

                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 ", 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(" ");

        }

        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(" ");

        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(' ');

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

            }

        }

        printf("%d ", 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(" ");

        }

        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(" ");

        

        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(" ");

        }

        return 0;

    }

    让明天,不后悔今天的所作所为
  • 相关阅读:
    如何只通过Sandboxed Solution启动一个定时执行的操作
    创建与SharePoint 2010风格一致的下拉菜单 (续) 整合Feature Custom Action框架
    创建与SharePoint 2010风格一致的下拉菜单
    《SharePoint 2010 应用程序开发指南》第二章预览
    SharePoint 2013 App 开发 (1) 什么是SharePoint App?
    使用Jscex增强SharePoint 2010 JavaScript Client Object Model (JSOM)
    搜索范围的管理
    SharePoint 2010 服务应用程序(Service Application)架构(1)
    SharePoint 2010 服务应用程序(Service Application)架构(2)
    SharePoint 2013 App 开发 (2) 建立开发环境
  • 原文地址:https://www.cnblogs.com/-yun/p/4256785.html
Copyright © 2011-2022 走看看