• 【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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    方法二:用递归

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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


    判断素数

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

    代码分析:

    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

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


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

    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

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


    最大公约数和最小公倍数

    例题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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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


    统计字符个数

    例题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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

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


    水仙花数

    例题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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

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


    求"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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

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


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


    🫵🫵🫵 祝各位接下来好运连连 💞
  • 相关阅读:
    下游批量推送的mysql库锁表
    基于javaweb的职工考勤系统
    【洛谷题解】P2066 机器分配
    一种复杂潮汐环境下长路由水深测量方法
    【iOS】计算器仿写
    企业电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理
    CSS :not-child() :nth-child()的一些常用属性
    【专业技能】程序员的软件工程素养之画好 UML 时序图
    Java 和 JavaScript 有什么区别?
    【C++】特殊类的设计(单例模式为主)(学习复习兼顾)
  • 原文地址:https://blog.csdn.net/m0_64826370/article/details/133552918