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

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

💖 博主CSDN主页:卫卫卫的个人主页 💞

👉 专栏分类:C程序设计谭浩强版本 👈

💯代码仓库:卫卫周大胖的学习日记💫

💪关注博主和博主一起学习!一起努力!

目录

斐波那契数列

例题1:求Fibonacci(斐波那契)数列的前40个数。这个数列有以下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13...,用数学方式表示为:

代码思路:

方法一:用非递归的思路解决

c 复制代码
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;
}

方法二:用递归

c 复制代码
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)

代码分析:

c 复制代码
#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之间的素数

代码分析:

c 复制代码
#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,求其最大公约数和最小公倍数

代码分析:

c 复制代码
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:输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

代码分析:

c 复制代码
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。

代码分析:

c 复制代码
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以内的完数。

代码分析:

c 复制代码
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;
}

运行结果:


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


🫵🫵🫵 祝各位接下来好运连连 💞

相关推荐
何陈陈2 分钟前
【Linux】线程池
linux·服务器·开发语言·c++
清风玉骨7 分钟前
Qt-QHBoxLayout布局类控件(42)
开发语言·qt
夏旭泽26 分钟前
C-include
开发语言·c++
通信仿真实验室28 分钟前
MATLAB使用眼图分析QPSK通信系统接收端匹配滤波后的信号
开发语言·算法·matlab
通信仿真实验室33 分钟前
(15)衰落信道模型作用于信号是相乘还是卷积
开发语言·人工智能·算法·matlab
远望樱花兔1 小时前
【d59】【Java】【力扣】146.LRU缓存
java·开发语言·算法
Bruce_Liuxiaowei1 小时前
Python小示例——质地不均匀的硬币概率统计
开发语言·python·概率统计
Vae_Mars1 小时前
WPF中的switch选择
开发语言·c#
我的运维人生1 小时前
Python技术深度探索:从基础到进阶的实践之旅(第一篇)
开发语言·python·运维开发·技术共享
Bonne journée1 小时前
‌在Python中,print(f‘‘)是什么?
java·开发语言·python