admin 管理员组

文章数量: 1087649

C语言经典例题精讲(精选)(上)

第一题(附加)

声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是( )

A.(int *p[10])(int*)

B.int [10]*p(int *)

C.int (*(*p)[10])(int *)

D.int ((int *)[10])*p

评析:本题作为阿里巴巴的一道笔试题,它的解答在网上众说纷纭,几乎没有说到点上。

解析:根据题意可知,声明一个指向数组的指针,所以这个指针肯定是数组指针之类的

数组的十个元素都是函数指针,函数指针所指向的函数返回值都是int,参数都是int*。读到这里

我们想一想,有什么数组居然可以装变量,装函数指针,显然没有这样的数组,数组内装的都是数值,所以这个数组装的是函数指针所指向的函数的地址,所以这个数组是什么?是一级函数指针数组,  它指向这十个函数的地址,题目要求就转变为声明一个指向一级函数指针数组的指针,那就是

二级函数数组指针,根据原函数返回值都是int,参数都是int*,我们可以直接写出答案

int (*(*p)[10]) (int *)       

第二题

打印9*9乘法口诀表
#include <stdio.h>
int main()
{int i = 0;int j = 0;for (i = 1; i <= 9; i++){for (j = 1; j <= i; j++){printf("%d*%d=%2d ", i, j, i * j);}printf("\n");}return 0;
}

第三题

打印100~200之间的素数
#include <stdio.h>
#include <math.h>
int main()
{int i = 0;for (i = 101; i <= 200; i+=2)//因为偶数不是素数,直接跳过{int j = 0;int flag = 1;//定义变量记录当前数是否为素数,假设是素数,变量值为1for (j = 2; j <=sqrt(i); j++) //遍历2~当前数的根号{if (i % j == 0)//存在⼀个数可以整除当前数{flag = 0;//不是素数break;}}if (flag == 1)//是素数就打印printf("%d ", i);}return 0;
}

解析:这是本题最优算法的解答,sqrt(i)是对i的开根号,关于j为什么就取到√i,我在这里稍作解释,√i * √i =i,如果i是合数,就一定至少存在一对除1和它本身的正因数,这两个正因数其中有一个必然小于或等于√i,另一个必然大于或等于√i。只要找到第一个正因数就直接判定是合数。

第四题

输⼊三个整数a,b,c,判断由a,b,c作为三条边组成的三角形,如果不能组成三角形则输出:非三角形;如果是三角形,再继续判断,如果是等边三角形,则输出:等边三角形;如果是等腰三角形,则输出:等腰三角形;否则输出普通三角形。
#include <stdio.h>
int main() 
{int a = 0;int b = 0;int c = 0;scanf("%d %d %d", &a, &b, &c);if (a + b > c && a + c > b && b + c > a) {if (a == b && b == c) {printf("等边三⻆形\n");}else if (a == b || a == c || b == c) {printf("等腰三⻆形\n");} else{printf("普通三⻆形\n");}} else{printf("⾮三⻆形\n");}return 0;
}

第五题

输⼊2个整数m和n,计算m和n的最大公约数
#include <stdio.h>
int main()
{int m = 0;int n = 0;scanf("%d %d", &m, &n);//辗转相除法int k = 0;while (k = m % n)//当n不能整除m,即k≠0,更新两个最值重复步骤计算n与m%n的最⼤公约数{m = n;n = k;}printf("%d\n", n);return 0;
}
解析:辗转相除法也称为欧几里得算法,是⼀种⽤来求两个正整数最大公约数的方法。它基于⼀个简单的数 学原理:如果 a 和 b 是两个正整数,且 a>b ,则a和b的最大公约数等于 b 和 a%b ( a 除以 b  所得的余数)的最大公约数。直到余数等于0为止,最后的除数就是两个数的最大公约数。

第六题

输入2个整数m和n,计算m和n的最小公倍数

#include <stdio.h>
int main()
{int m = 0;int n = 0;//输⼊scanf("%d %d", &m, &n);//18 24int k = 0;int mul = m*n;while (k = m % n)//

本文标签: C语言经典例题精讲(精选)(上)