栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言100题(3)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言100题(3)

第21题~40题
  • 第21题:
  • 第22题:
  • 第23题:
  • 第24题:
  • 第25题:
  • 第26题:
  • 第27题:
  • 第28题:
  • 第29题:
  • 第30题:
  • 第31题:
  • 第32题:
  • 第33题:
  • 第34题:
  • 第35题:
  • 第36题:
  • 第37题:
  • 第38题:
  • 第39题:
  • 第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--%ct b--%ct c--%ct", 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
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
int factorial(int);
int main(void)
{
	int i = 5;
	printf("%d! = %dn", 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
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
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
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
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("mondayn");		
		case 't':
			printf("Please enter the second letter.n");
			scanf("%c", &ch2);
			if (ch2 == 'u')
			{
				printf("tuesdayn");
				break;
			}
			if (ch2 == 'h')
			{
				printf("thursdayn");
				break;
			}
		case 'w':
			printf("wednesdayn");
			break;
		case 'f':
			printf("fridayn");
			break;
		case 's':
			printf("请输入下一个字母n");
			scanf("%c", &ch2);
			if (ch2 == 'a')
			{
				printf("saturdayn");
				break;
			}

			if (ch2 == 'u')
			{
				printf("sundayn");
				break;
			}
		default:
			printf("errorn"); 
			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 = '';
	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]
				temp = number[j];
				number[j] = number[k];
				number[k] = temp;
			}
		}
	}
	for (i = 0; i < 10; i++)
		printf("%4d", number[i]);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869777.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号