【C语言】循环结构程序设计(第二部分 -- 习题讲解)

前言:昨天我们学习了C语言中循环结构程序设计,并分析了循环结构的特点和实现方法,有了初步编写循环程序的能力,那么今天我们通过一些例子来进一步掌握循环程序的编写和应用。

💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:C程序设计谭浩强版本 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!这里是引用

斐波那契数列

例题1:求Fibonacci(斐波那契)数列的前40个数。这个数列有以下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13…,用数学方式表示为:
在这里插入图片描述
代码思路:
方法一:用非递归的思路解决

int main()
{
	int num1 = 1;
	int num2 = 1;
	int i = 0;
	int tmp = 0;
	int sum = 0;
	for (i = 0; i < 40; i++)
	{
		if (i < 3)
		{
			tmp = 1;
			printf("%d ", tmp);//前两项是1所以直接输出即可
			sum = 2;
		}
		else
		{
			tmp = num1 + num2;//第三项开始后一项是前两项的和
			num1 = num2;//让后一项赋值给前一项
			num2 = tmp;//同理
			printf("%d ", tmp);
			sum += tmp;//求和
		}
	}
	printf("\n");
	printf("sum = %d\n", sum);
	return 0;
}

方法二:用递归

int Fibon1(int num)
{
	if (num == 1 || num == 2)
	{
		return 1;
	}
	else
	{

		return Fibon1(num - 1) + Fibon1(num - 2);//用递归的方式
	}

}

int main()
{
	int n = 0;
	int ret = 0;
	scanf("%d", &n);
	ret = Fibon1(n);
	printf("ret=%d", ret);
	return 0;
}

运行结果:
在这里插入图片描述


判断素数

例题2:输入一个大于3的数,判定它是否为素数(prime)

代码分析:

#include <math.h>
int is_prime(int n)
{
	int i = sqrt(n);//一个数如果是素数可以写成两个数相乘的形式
	int flag = 1;//判断标志
	while (i > 1)
	{
		if (n % i == 0)//如果被整除说明不是素数
		{
			int flag = 0;
			return 0;
		}
		i--;
	}
	if (flag == 1)//如果flag = 1说明他没有整除
	{
		return 1;
	}
}
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (is_prime(num))
	{
		printf("该数:%d是素数\n", num);
	}
	else
	{
		printf("该数:%d不是素数\n", num);

	}
	return 0;
}

运行结果:
在这里插入图片描述


例题3:求100到200之间的素数
代码分析:

#include <math.h>
int is_prime(int n)
{
	int i = sqrt(n);//一个数如果是素数可以写成两个数相乘的形式
	int flag = 1;//判断标志
	while (i > 1)
	{
		if (n % i == 0)//如果被整除说明不是素数
		{
			int flag = 0;
			return 0;
		}
		i--;
	}
	if (flag == 1)//如果flag = 1说明他没有整除
	{
		return 1;
	}
}
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		if(is_prime(i))//判断是否是素数
			printf("%d ", i);//是素数则打印i的值
	}
	return 0;
}

运行结果:
在这里插入图片描述


最大公约数和最小公倍数

例题4:输入两个正整数m和n,求其最大公约数和最小公倍数
代码分析:

int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	int min = m < n ? m : n;//找出其中的最小值;
	while (1)
	{
		if (m % min == 0 && n % min == 0)//找到能同时能被它们俩整除的数
			//如果能被整除说明是他们的最大公约数
		{
			break;
		}
		min -= 2;
	}
	int j = 1;
	while (m * j % n != 0)//两个数的最小公倍数一定是它们俩个的倍数
	//因此找到其中一个数的倍数,看他的倍数的积是否可以整除另一个数
	{
		j++;
	}
	printf("最大公约数是: %d  最小公倍数是: %d", min, m * j);
	printf("\n");
	return 0;
}

运行结果:
在这里插入图片描述


统计字符个数

例题4:输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
代码分析:

int main()
{
	char arr[100] = { 0 };
	char ch = 0;
	int i = 0;
	int Eng_letter = 0;//英文字符
	int space = 0;//空格
	int number = 0;//数字
	int others = 0;//其其它字符
	while ((ch = getchar()) != '\n')//输入字符
	{
		arr[i++] = ch;
	}
	int len = strlen(arr);
	for (i = 0; i < len; i++)
	{
		if ((arr[i] >= 'a' && arr[i] <= 'z') || (arr[i] >= 'A' && arr[i] <= 'Z'))//判断是否是英文字符
		{
			Eng_letter++;//是的话自增加1
		}
		else if (arr[i] >= '0' && arr[i] <= '9')//判断数字
		{
			number++;
		}
		else if (arr[i] == ' ')//判断空格
		{
			space++;
		}
		else
			others++;//是否是其它的
	}
	printf("Eng_letter = %d number = %d space = %d others = %d", Eng_letter, number, space, others);
	return 0;
}

运行结果:
在这里插入图片描述


水仙花数

例题5:输出所有的"水仙花数",所谓水仙花数是指一个3位数,其各位数字的立方和等于该数本身。例如153是水仙花数,因为153 = 1 3 + 5 3 + 3 3 1^3 + 5 ^ 3 + 3^3 13+53+33
代码分析:

int Narcissistic_number(int n)
{
	int sum = 0;
	int y = n;
	while (n != 0)//求出该数的 每一位数的3次方
	{
		int x = n % 10;//求出每一位数
		sum += x * x * x;
		n = n / 10;
	}
	if (sum == y)//判断是否等于它本身
	{
		return y;
	}
	else
		return 0;
}
int main()
{
	int i = 0;
	int sum = 0;
	for (i = 100; i < 1000; i++)
	{		
		if (Narcissistic_number(i))
		{
			printf("%d ", Narcissistic_number(i));
		}
	}
	return 0;
}

运行结果:
在这里插入图片描述


求"1000之内的完数"

例题6:一个数如果恰好等于它的因子之和,这个数就称为完数。例如,6的因子为1,2,3,而6 = 1 + 2 + 3,因此6就是完数。编写程序找出1000以内的完数。
代码分析:

int if_factor(int n)
{
	int sum = 0;
	int i = 1;
	while (i < n)
	{
		if (n % i == 0)//找出能被它整数的项,即找出因数
		{
			sum += i;
		}
		i++;
	}
	if (sum == n)//判断是否是完数
	{
		return sum;
	}
	else
		return 0;
}
void factor(int n)//打印因数
{
	int i = 1;
	while (i < n)
	{
		if (n % i == 0)
		{
			printf("%d ", i);
		}
		i++;
	}
}
int main()
{
	int i = 0;
	for (i = 2; i < 10000; i++)
	{
		if (if_factor(i))
		{
			printf("%d ", if_factor(i));//判断是否是完数
			printf("因数是:");
			factor(i);//打印出因数
			printf("\n");
		}
	}
	return 0;
}

运行结果:
在这里插入图片描述


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


🫵🫵🫵 祝各位接下来好运连连 💞
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卫卫周大胖;

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值