C初级阶段练习题目(三)

来源:互联网 发布:福州专业淘宝美工培训 编辑:程序博客网 时间:2024/05/17 07:16
//***********************21、求一个3*3矩阵对角线元素之和**********************
intmain()
{
                inti, j;
                intsum1 = 0;
                intsum2 = 0;
                inta[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                for(i = 0; i < 3; i++)
                {
                                for(j = 0; j < 3; j++)
                                {
                                                if(i == j) //       \方向 主对角线元素之和
                                                {
                                                                sum1 = sum1 + a[i][j];
                                                }
                                                if(i + j == 2) //    /方向 副对角线元素之和
                                                {
                                                                sum2 = sum2 + a[i][j];
                                                }
                                }
                }
                                printf("主对角线元素之和=%d\n", sum1);
                                printf("副对角线元素之和=%d\n", sum2);
                                printf("对角线元素之和=%d\n", sum1 + sum2 - a[1][1]);

                return0;

}

//******扩展:当矩阵为N*N时
#defineN4
intmain()
{
                inti, j;
                intsum1 = 0;
                intsum2 = 0;
                inta[N][N] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 };
                for(i = 0; i <N; i++)
                {
                                for(j = 0; j <N; j++)
                                {
                                                if(i == j) //       \方向 主对角线元素之和
                                                {
                                                                sum1 = sum1 + a[i][j];
                                                }
                                                if(i + j ==N-1) //    /方向 副对角线元素之和
                                                {
                                                                sum2 = sum2 + a[i][j];
                                                }
                                }
                }
                printf("主对角线元素之和=%d\n", sum1);
                printf("副对角线元素之和=%d\n", sum2);
                if(N% 2 == 0) //偶数矩阵
                {
                                printf("对角线元素之和=%d\n", sum1 + sum2);
                }
                if(N% 2 != 0)
                {
                                printf("对角线元素之和=%d\n", sum1 + sum2 - a[(N- 1) / 2][(N- 1) / 2]);
                }
                return0;
}

//******************22、将一个整形数组逆序**************************
int* Reverse(int*a,intleft,intright)
{
                inttemp = 0;
                while(left<right)
                {
                                temp =a[left];
                                a[left] =a[right];
                                a[right] = temp;
                                left++;
                                right--;
                }
                returna;
}

intmain()
{
                inti = 0;
                intarr[] = { 1, 2, 3, 4, 5 };
                intsize =sizeof(arr) /sizeof(arr[0]);
                Reverse(arr, 0, size - 1);
                for(i = 0; i < size; i++)
                {
                                printf("arr[i]=%d\n", arr[i]);
                }
                return0;
}

//*****************23、对一个整型数组排序(冒泡排序)*******************
int* BubbleSort(int*a,intsize)
{
                inti = 0;
                intj = 0;
                inttmp = 0;
                for(i = 0; i <size; i++)
                {
                                for(j = 0; j <size; j++)
                                {
                                                if(a[j] <a[j + 1])
                                                {
                                                                tmp =a[j];
                                                                a[j] =a[j + 1];
                                                                a[j + 1] = tmp;
                                                }
                                }
                }
                returna;
}


intmain()
{
                inti = 0;
                intarr[] = { 1, 4, 3, 7, 2, 9, 5, 0, 6 };
                intsize =sizeof(arr) /sizeof(arr[0]);
                BubbleSort(arr, size);
                for(i = 0; i < size; i++)
                {
                                printf("%d  ", arr[i]);
                }
                return0;
}

//*****************25、用递归的方式求斐波那契的第n个数**********************
//           | 0    n=0
//           | 1    n=1
//  F(n)=| 1    n=2
//           | F(n-1)+F(n-2)   n>2

//   0  1  1  2  3  5  8  13  21  34  55  89 ...
typedeflonglong INT;
INTFib(intnum)
{
                if(num== 0)
                                return0;
                if(num== 1)
                                return1;
                returnFib(num- 1) + Fib(num- 2);
}

intmain()
{
                intn = 0;
                INTret = 0;
                printf("请输入序号:");
                scanf("%d", &n);
                ret=Fib(n);
                printf("%d", ret);
                return0;
}

//**************26、用非递归的方式求斐波那契数列的第n个数********************
//用数组的话不知道要开辟多大的空间,如果num的值小,而开辟的空间太大,会造成空间浪费
//最好的方法是用三个变量不停交换值,循环num-1次,占用空间12个字节,效率也不慢
//如果是在C++中,可以用vector类型的数组来放数据,可自动增容,也可用三个指针

intFib(intnum)
{
                inta = 0;
                intb = 1;
                intc = 0;
                inti = 0;
                if(num== 0)
                                returna;
                if(num== 1)
                                returnb;
                for(i = 2; i <=num; i++)
                {
                                c = a + b;//  1   2   3   5
                                a = b;   //   0   1   1   2
                                b = c;   //   1   1   2   3
                }
                returnc;
}


intmain()
{
                intn = 0;
                scanf("%d", &n);
                intret=Fib(n);
                printf("第%d项的值=%d", n,ret);
                return0;
}

//************27、编写一个函数求字符串的长度(不使用库函数)***************
//注意:*p的类型要和str的类型一致,否则传参失败,程序结果出错
#include<assert.h>
intmy_strlen(constchar*str)
{
                assert(str);
                intcount = 0;
                char*p =str;
                if(*p ==NULL)
                                return0;
                while(*p !='\0')
                {
                                count++;
                                p++;
                }
                returncount;
}


intmain()
{
                chara[] ="abcdef";
                intret=my_strlen(a);
                printf("字符串长度=%d",ret);
                return0;
}


//*******************28、不允许创建临时变量求一个字符串的长度*****************
//注意:进入程序要判断参数是否存在,参数是否为空
#include<assert.h>
int  _strlen(constchar*a)
{
                assert(a);
                if(*a==NULL)
                                return0;
                else
                                return(1 + _strlen(a+ 1));
}

intmain()
{
                chara[] ="abcdefgh1234556";
                intret=_strlen(a);
                printf("字符串长度=%d", ret);
                return0;
}


//*******************29、对任意一个整型数组排序(选择排序)*******************
//选择排序举例: 5  7  4  9  3  0  8  2  1
//               0  7  4  9  3  5  8  2  1
//               0  1  4  9  3  5  8  2  7
//               0  1  2  9  3  5  8  4  7
//               0  1  2  3  9  5  8  4  7
//               0  1  2  3  4  5  8  9  7     .....
//begin从第一个数开始,从除第一个数以外的数中找到最小的数,然后与第一个数交换
//begin++,指向第二个数,从第二个往后的数中找最小数,然后与之交换
//直到begin指向最后一个数时,表示顺序以及排好

//NOTE::找其余数中的最小值
#include<assert.h>
voidSelectSort(int*a,intsize)
{
                assert(a);
                intbegin = 0;
                inti = 0;
                intMin = 0;
                inttemp = 0;
                while(begin <size- 1)  //当begin指向倒数第一个数时已经排好
                {
                                Min = begin;
                                for(i = begin + 1; i <size; i++)
                                {
                                                if(a[i] <a[Min])   //每次都和最小的那个数比较
                                                {
                                                                Min = i;
                                                }
                                }
                                
                                temp =a[Min];
                                a[Min] =a[begin];
                                a[begin] = temp;
                                
                                begin++;
                }
}


intmain()
{
                inti = 0;
                intarr[] = { 9, 7, 4, 9, 3, 1, 8, 2, 0 };
                SelectSort(arr,sizeof(arr) /sizeof(arr[0]));
                for(i = 0; i <sizeof(arr) /sizeof(arr[0]); i++)
                {
                                printf("%d   ", arr[i]);
                }
                return0;
}


//*****************30、求一个数的二进制序列中1的个数**************************
//利用十进制转二进制的方法,余数倒写则为十进制的二进制表示
//在这里不用看顺序,只需要统计1的个数,所以只需统计每次除以2余数是1的个数

intmain()
{
                size_tdata = 0;
                intcount = 0;
                scanf("%d", &data);
                while(data)
                {
                                if(data % 2 == 1)
                                {
                                                count++;
                                }
                                data = data >> 1; // data=data/2;
                }
                printf("count=%d\n", count);

                return0;
}


0 0
原创粉丝点击