C语言100题(21~40)

第21题:

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

解析:此题类似已知结果求原因,就从第10天出发,这里只剩一个桃子。那么第9天就剩 (1 + 1) * 2 = 4 个桃子,第8天就剩 (4 + 1 ) *2 = 10个,以此类推得到公式D(n-1) = ( D(n) + 1 ) *2。这里注意,逆向思考:将第10天作为第1天,然后按照公式依次叠加即可。

	int Tao[10];
	Tao[0] = 1;
	for (int n = 1; n < 10; n++)
	{
		Tao[n] = ( Tao[n - 1] + 1 ) * 2;
	}
	printf("The number of Peach is %d in first day.", Tao[9]);
	return 0;

第22题:

题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

解析:首先,c不和x,z比。可以直接进行赋值c = ‘y’。然后用两个for循环去找到a与b的对手

	//设置3个未知数用来寻找a,b,c所对应的3个人,a-i,b-j,c-k
	char i, j, k;
	 k = 'y';
	 for (i = 'x'; i <= 'z'; i++)
	 {
		 //只要i不等于x与y,则跳出循环留下i的值
		 if (i != k && i != 'x')
			 break;
	 }
	 for (j = 'x'; j <= 'z'; j++)
	 {
	 	//只要j不等于i与k,则跳出循环留下j的值
		 if (j != i && j != k)
			 break;
	 }
	 printf("顺序为:a--%c\t b--%c\t c--%c\t", i, j, k);
	return 0;

第23题:

题目:打印菱形。

解析:用一个变量控制行数。在1到3行,打印星号的起点为4-行数,终点为4+行数。在5~7行,打印星号的起点为行数-4;这里唯一麻烦的是5 ~ 7行的终点:首先5 ~7行打印星号的终点为7,6,,5。但是行数为5,6,7所以这里需要加一个额外的变量来控制。

	//我们用7 x 7 的矩阵来表示菱形
	int row; //定义行数
	row = 1; 
	int count = 2; //用于控制5~7行打印星号
	while (row <= 7)
	{
		//中间第4行打印7个星号
		if (row == 4)
		{
			for (int i = 1; i <= 7; i++)
				printf("*");
			printf("\n");
		}
		//其他行打印
		else
		{
			//1~3行打印
			if (row <= 3)
			{
				for (int i = 1; i <= 7; i++)
				{
					if (i>(4 - row) && i < (4 + row)) //这里 4-row 与 4+row 用来控制打印星号的起点与终点
						printf("*");
					else
						printf(" ");
				}
				printf("\n");
			}
			//4~7行打印
			else
			{
				for (int i = 1; i <= 7; i++)
				{
					if (i>(row-4) && i < (row+count)) //这里row-4 与 row+count 用来控制打印星号的起点与终点
						printf("*");
					else
						printf(" ");
				}
				printf("\n");
				count -= 2; //由于5~7行,行数在递增,但星号的个数在递减,需要加一个变量控制。
			}
		}
		row++;
	}
	return 0;

第24题:

题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。

解析:分母与分子是很类似于斐波那契数列,当然也有些不同。在分母中,定义前2项,然后后面的每一项=前面二项之和。分子也是如此,唯一不同的是起始项不同。

	//可以定义4个数,然后不断更新来解题。这里采用数组的方式
	float Denominator[20]; //分母
	float Molecule[20]; //分子
	float result = 0;
	Denominator[0] = 1;
	Denominator[1] = 2;
	Molecule[0] = 2;
	Molecule[1] = 3;
	for (int n = 0; n <= 19; n++)
	{
		if (n < 2)
		{
			result += Molecule[n] / Denominator[n];
		}
		else
		{
			Molecule[n] = Molecule[n - 1] + Molecule[n - 2];
			Denominator[n] = Denominator[n - 1] + Denominator[n - 2];
			result += Molecule[n] / Denominator[n];
		}
	}
	printf("The result is %4.3f", result);
	return 0;

注意:在定义数组的时候记得是float或者double。千万别定义成整型,因为整型的数据相除后还是整型。

第25题:

题目:求1+2!+3!+…+20!的和。

解析:采用函数与for循环的方法去求得最终结果。for循环从1~20,函数用于计算每个循环的乘积。

#include<stdio.h>
long double Factorial(int n);
int main(void)
{
	int number;
	long double sum = 0;
	for (number = 1; number <= 20; number++)
	{
		sum += Factorial(number);
	}
	printf("The factorial sum is %lf", sum);
	return 0;
}

long double Factorial(int n)
{
	long double result = 1;
	for (int i = n; i >= 1; i--)
		result *= i;
	return result;
}

注意:这里需要把返回值、函数中求阶乘的值以及最后的打印结果全部设置为long double 类型。因为这个数据量很大,若设置为int类型会导致数据丢失

第26题:

题目:利用递归方法求5!。

解析:递归在我理解的里:就是对一函数的循环调用,也可以说在定义的一个函数中不断的调用这个函数本身,直到满足if条件,再依次返回。最重要的便是递归一定不能忘记判断条件,不然就无限递归了。

#include<stdio.h>
int factorial(int);
int main(void)
{
	int i = 5;
	printf("%d! = %d\n", i, factorial(i));
	return 0;
}

int factorial(int n)
{
	int sum;
	if (n == 0)
		sum = 1;
	else
		sum = n * factorial(n - 1);
	return sum;
}

第27题:

题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

解析:我这里采用了指针的递归调用。先是输入一个字符串,然后存入数组中。用指针去调用数组的地址从尾部开始打印。

#include<stdio.h>
void Print(int,char *);
int main(void)
{
	char input[5];
	char str;
	char *Input;
	Input = &str;
	printf("Please enter five chars.");
	scanf("%s", &str);
	for (int i = 0; i < 5; i++)
	{
		input[i] = *Input++;
	}
	Print(5,input);
}

void Print(int n,char *Input)
{
	if (n == 0)
		return;
	else
	{
		printf("%c", *(Input + n - 1));
		Print(n - 1,Input);
	}
}

存在的问题:虽然结果没问题,但input数组在堆栈区崩溃了。所以如果为了没有一点问题,可以不采取指针递归调用的方法哦。我这里只是为了训练自己,然自己将知识更多的结合起来。

第28题:

题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

解析:利用递归解决这个问题,和27题类似。从第一个出发,往回推即可。A1=10;A(n)= A(n-1) + 2,n≥2。

#include<stdio.h>
int age(int);
int main(int argc ,char *argv [])
{
	printf("This fifth person's is %d", age(5));
	return 0;
}

int age(int n)
{
	int start;
	if (n == 1)
		start = 10;
	else
		start = age(n - 1) + 2;
	return start;
}

第29题:

题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

解析:用输入的数字依次去分解出万位,千位,百位,十位,个位。方法:取余再除即可完成分解。

#include<stdio.h>
int main()
{
	int  number;
	int bit[5];
	int count = 0; //用于计算几位
	printf("Please enter a number:");
	scanf("%d", &number);
	bit[0] = number / 10000;
	bit[1] = number % 10000 / 1000;
	bit[2] = number % 1000 / 100;
	bit[3] = number % 100 / 10;
	bit[4] = number % 10;
	for (int i = 4; i >= 0; i--)
	{
		if (bit[i])
			count++;
		printf("%d", bit[i]);
	}
	printf("\n");
	printf("This number possess %d digits", count);
	return 0;
}

第30题:

题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

解析:类似于29题思路,完成分解后再加一步判断即可。

#include<stdio.h>
int main()
{
	int  number;
	int bit[5];
	int count = 0; //用于计算几位
	printf("Please enter five digits:");
	scanf("%d", &number);
	bit[0] = number / 10000;
	bit[1] = number % 10000 / 1000;
	bit[2] = number % 1000 / 100;
	bit[3] = number % 100 / 10;
	bit[4] = number % 10;
	if (bit[4] == bit[0] && bit[3] == bit[1])
		printf("This %d is Palindrome number", number);
	else
		printf("This %d is not Palindrome number", number);
	return 0;
}

第31题:

题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

解析:用switch case 语句完成判断即可。

	char ch1,ch2;
	printf("Please enter the first letter.\n");
	scanf("%c", &ch1);
	while (getchar() != '\n') //处理保留的换行符
		continue;
	switch (ch1)
	{
		case 'm':
			printf("monday\n");		
		case 't':
			printf("Please enter the second letter.\n");
			scanf("%c", &ch2);
			if (ch2 == 'u')
			{
				printf("tuesday\n");
				break;
			}
			if (ch2 == 'h')
			{
				printf("thursday\n");
				break;
			}
		case 'w':
			printf("wednesday\n");
			break;
		case 'f':
			printf("friday\n");
			break;
		case 's':
			printf("请输入下一个字母\n");
			scanf("%c", &ch2);
			if (ch2 == 'a')
			{
				printf("saturday\n");
				break;
			}

			if (ch2 == 'u')
			{
				printf("sunday\n");
				break;
			}
		default:
			printf("error\n"); 
			break;
	}
	return 0;

第32题:

题目:删除一个字符串中的指定字母,如:字符串 “aca”,删除其中的 a 字母。

解析:用字符串函数strchr或者strrchr去找到想要删除的字符在字符串中的指针位置即可。

	char words[30];
	char ch;
	char *ptr;
	puts("Please enter the string: \n");
	fgets(words, 30, stdin);
	puts("Please enter the character you want to delete: \n");
	scanf("%c", &ch);
	while ((ptr = strchr(words, ch)) != NULL)
	{
		*ptr = ' ';
	}
	fputs(words, stdout);
	return 0;

第33题:

题目:判断一个数字是否为质数。

解析:质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除。那么这个题本质上也是对数不断拆分的过程。只要出现在2~输入的数的一半有能被整除的数说明这个数不是质数。

	int number,i;
	puts("Please enter a number:");
	scanf("%d", &number);
	for (i = 2; i <= (number / 2); i++)
	{
		if ((number % i) == 0)
		{
			printf("This %d is not a prime number", number);
			break;
		}
	}
	if (i == (number / 2 + 1))
	{
		printf("This %d is a prime number", number);
	}
	return 0;

第34题:

题目:练习函数调用。

解析:自定义一个函数,然后自己调用。简单写了个猜数的小游戏。

int funny(int);
int answer = 6;
int main(void)
{
	int number;
	printf("Please enter the guess number:");
	scanf("%d", &number);
	while (funny(number))
	{
		printf("Continue this game.Try again a number:");
		scanf("%d", &number);
	}
	return 0;
}
int funny(int n)
{
	if (n == answer)
	{
		printf("Congradulation you guess right \n");
		return 0;
	}
	else if (n > answer)
	{
		printf("Sad,your guess is big \n");
		return 1;
	}
	else
	{
		printf("Sad,your guess is small \n");
		return 1;
	}
}

第35题:

题目:字符串反转,如将字符串 “www.runoob.com” 反转为 “moc.boonur.www”。

解析:使用指针从尾到头打印即可。当然你也可以用指针完成从尾头的数组改变,然后再打印。思路是类似的。

	char str[30];
	char *find;
	int length;
	puts("Please enter the string: \n");
	fgets(str, 30, stdin);
	find = strchr(str, '\n');
	*find = '\0';
	length = strlen(str);
	find = str;
	for (int i = length - 1; i >= 0; i--)
		printf("%c", *(find + i));
	return 0;

第36题:

题目:求100之内的素数。

解析:和第33题的思路是一样的,只是更改下数字即可。

	int number,i,count;
	count = 0;
	for (number = 1; number <= 100; number++)
	{
		for (i = 2; i <= (number / 2); i++)
		{
			if ((number % i) == 0)
				break;
		}
		if (i == (number / 2 + 1))
		{
			printf("%2d ", number);
			count++;
		}
		if (count % 5 == 0)
			printf("\n");
		}
	return 0;

第37题:

题目:对10个数进行排序。

解析:输入10个数字,然后使用冒泡排序法进行排序。

	//采用升序排列
	int i, j, k;
	int number[10];
	int temp; //用作交换时的临时变量
	printf("Please enter ten numbers:\n");
	for (i = 0; i < 10; i++)
		scanf("%d", &number[i]);
	for (j = 0; j < 9; j++)
	{
		for (k = j+1; k < 10; k++) //注意这里k要写成j+1,而不是0
		{
			if (number[j]>number[k])
			{
				temp = number[j];
				number[j] = number[k];
				number[k] = temp;
			}
		}
	}
	for (i = 0; i < 10; i++)
		printf("%4d", number[i]);

第38题:

题目:求一个3*3矩阵对角线元素之和

解析:用双重for循环控制二维数组的输入,再用number[i][i]得到对角线元素之和

	int number[3][3];
	int i, j;
	int sum = 0;
	printf("Please enter 3 x 3 matrix:");
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			scanf("%d", &number[i][j]);
		}
	}
	for (i = 0; i < 3; i++)
		sum += number[i][i];
	printf("%d", sum);
	return 0;

第39题:

题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

解析:先用37题的排序方法,将数组排好序。然后再输入一个数,按照排序规律放入数组中。插入的思路:输入的数去跟排好序的数组进行比对,然后得到第一个比输入大的数,记录下来。然后把数组第一个比他大的数放在数组的尾部,输入的数进行插队。再不停地数组进行交换即可。

	//采用升序排列
	int i, j, k,position;
	int number[11];
	int temp,Number; //用作交换时的临时变量
	printf("Please enter ten numbers:\n");
	for (i = 0; i < 10; i++)
		scanf("%d", &number[i]);
	for (j = 0; j < 9; j++)
	{
		for (k = j+1; k < 10; k++)
		{
			if (number[j]>number[k])
			{
				temp = number[j];
				number[j] = number[k];
				number[k] = temp;
			}
		}
	}
	for (i = 0; i < 10; i++)
		printf("%4d", number[i]);
	printf("\n");
	printf("Please enter the number you want to inser:");
	scanf("%d", &Number);
	for (i = 0; i < 10; i++)
	{
		if (number[i]>Number)
		{
			position = i;
			temp = number[i];
			number[i] = Number; 
			number[10] = temp;
			break;
		}
	}
	for (i = position+1; i < 11; i++)
	{
		temp = number[i];
		number[i] = number[10];
		number[10] = temp;
	}
	for (i = 0; i < 11; i++)
		printf("%4d", number[i]);

第40题:

题目:将一个数组逆序输出。

解析:与37题的思路是样的,只是将升序改为逆序。

	//采用升序排列
	int i, j, k;
	int number[10];
	int temp; //用作交换时的临时变量
	printf("Please enter ten numbers:\n");
	for (i = 0; i < 10; i++)
		scanf("%d", &number[i]);
	for (j = 0; j < 9; j++)
	{
		for (k = j+1; k < 10; k++)
		{
			if (number[j]<number[k])
			{
				temp = number[j];
				number[j] = number[k];
				number[k] = temp;
			}
		}
	}
	for (i = 0; i < 10; i++)
		printf("%4d", number[i]);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是c语言笔试面试100: 1. C语言有哪些数据类型? 2. 如何声明一个整型变量? 3. 如何声明一个字符型变量? 4. 如何声明一个浮点型变量? 5. 如何声明一个双精度型变量? 6. 如何声明一个布尔型变量? 7. 如何声明一个指针变量? 8. 如何定义一个常量? 9. 如何定义一个宏? 10. 什么是变量作用域? 11. 什么是局部变量? 12. 什么是全局变量? 13. 如何定义一个函数? 14. 如何调用一个函数? 15. 什么是指针? 16. 如何定义一个指针? 17. 如何使用指针访问变量? 18. 如何使用指针访问数组元素? 19. 如何使用指针访问结构体成员? 20. 如何使用指针作为函数参数? 21. 如何使用指针返回函数值? 22. 什么是动态内存分配? 23. 如何使用malloc函数分配内存? 24. 如何使用free函数释放内存? 25. 什么是数组? 26. 如何定义一个数组? 27. 如何访问数组元素? 28. 如何使用数组作为函数参数? 29. 如何使用数组作为函数返回值? 30. 什么是字符串? 31. 如何定义一个字符串? 32. 如何初始化一个字符串? 33. 如何比较两个字符串? 34. 如何连接两个字符串? 35. 如何复制一个字符串? 36. 什么是结构体? 37. 如何定义一个结构体? 38. 如何访问结构体成员? 39. 如何使用结构体作为函数参数? 40. 如何使用结构体作为函数返回值? 41. 什么是联合体? 42. 如何定义一个联合体? 43. 如何访问联合体成员? 44. 什么是枚举? 45. 如何定义一个枚举? 46. 如何使用枚举? 47. 什么是位运算? 48. 如何使用位运算? 49. 什么是条件语句? 50. 如何使用if语句? 51. 如何使用switch语句? 52. 什么是循环语句? 53. 如何使用while循环? 54. 如何使用do-while循环? 55. 如何使用for循环? 56. 如何使用break语句? 57. 如何使用continue语句? 58. 什么是函数指针? 59. 如何定义一个函数指针? 60. 如何使用函数指针调用函数? 61. 什么是文件操作? 62. 如何打开一个文件? 63. 如何关闭一个文件? 64. 如何读取一个文件? 65. 如何写入一个文件? 66. 如何复制一个文件? 67. 什么是数据结构? 68. 什么是链表? 69. 如何定义一个链表? 70. 如何遍历一个链表? 71. 如何插入一个节点到链表? 72. 如何删除一个节点从链表? 73. 什么是栈? 74. 如何定义一个栈? 75. 如何入栈? 76. 如何出栈? 77. 什么是队列? 78. 如何定义一个队列? 79. 如何入队? 80. 如何出队? 81. 什么是递归? 82. 如何使用递归? 83. 什么是排序? 84. 什么是冒泡排序? 85. 什么是选择排序? 86. 什么是插入排序? 87. 什么是快速排序? 88. 什么是归并排序? 89. 什么是堆排序? 90. 什么是查找? 91. 什么是线性查找? 92. 什么是二分查找? 93. 什么是哈希查找? 94. 什么是图? 95. 什么是有向图? 96. 什么是无向图? 97. 什么是拓扑排序? 98. 什么是最短路径? 99. 什么是最小生成树? 100. 什么是动态规划? 希望这些目能够帮助你更好地准备C语言的笔试和面试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值