###C语言程序设计-----C语言学习(8)## 斐波那契数列问题,素数问题,人数分配问题。

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。

 

###C语言程序设计-----C语言学习(8)## 斐波那契数列问题,素数问题,人数分配问题。_第1张图片 

  今天,我们主要分享三个问题如何用C语言去求解,1.斐波那契数列问题,2.素数列举问题,3.人数分配问题。

 

一.  斐波那契数列问题 

 

(1)问题叙述:斐波那契数列问题。输人正整数 n(1<=n<=46),输出斐波那契(Fibonacci)数列的前n项:1,1,2,3,5,8,13,·····,每行输出 5个。Fibonacci 数列就是满足任一项数字是前两项的和(最开始两项均定义为 1)的数列。

(2)问题分析:计算斐波那契数列时,从第 3 项开始,每一项的值就是前 2项的和。用两个变量存储最近产生的两个序列值,计算出新一项数据后,需要更新这两个变量的值。假定最开始两项分别用x1=1和x2=1表示,则新项x=x1+x2,然后更新x1和x2:x1=x2及x2=x,为计算下一个新项x作准备。题目要求输出n项,循环次数确定,可采用 for 语句。

(3)方法总结:迭代法也称辗转法,是一个不断从变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代法是用计算机解决问题的一种基本方法,它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出新值。

(4)源程序:

#include 
int main()
{
	int i, n, x, x1, x2;  //x1和x2依次代表前两项,x表示其后一项 
	printf("Enter n:");   //提示输入所需输出项的个数 
	scanf("%d", &n);
	if (n<1||n>46)
	{
		printf("Invalid.\n");
	}
	else if (n==1)
	{
		printf("%10d", 1);  //n为1时输出1 
	}
	else
	{
		x1=1;
		x2=1;
		printf("%10d%10d", x1, x2);  //先输出前两项 
		for (i=3; i<=n; i++)  //循环输出n-2项 
		{
			x=x1+x2;    //计算新的一项 
			printf("%10d", x);
			if (i%5==0)
			{
				printf("\n");  //项数为5的倍数就换行 
			}
			//重新定义前两项 
			x1=x2;  
			x2=x;
		}
	}
	
	return 0;
 } 

 

 二.  素数问题

 

(1)问题叙述:素数问题。输人2个正整数 m和n(1<=m<=n<=500),输出m到n之间的全部素数,每行输出 10个。素数就是只能被 1 和自身整除的正整数,1 不是素数,2 是素数。

(2)问题分析:可参照之前发的博客(如何判断素数)。

(3)源程序:

#include 
#include 
int main()
{
	int count, i, k, flag, limit, m, n;  //flag表示是否为素数 
	printf("Enter m n:");
	scanf("%d %d", &m, &n);
	count=0;  //count记录素数的个数 
	if (m<1||n>500||m>n)
	{
		printf("Invalid.\n");
	}
	else 
	{
		for (k=m; k<=n; k++)
		{
			if (k<=1)
			{
				flag=0;
			}
			else if (k==2)
			{
				flag=1;
			}
			else
			{
				flag=1;
				limit=sqrt(k)+1;
				for (i=2; i<=limit; i++)
				{
					if (k%i==0)
					{
						flag=0;
						break;
					}
				}
			}
			if (flag==1)
			{
				printf("%6d", k);
				count++;
				if (count%10==0)  //count为10的倍数就换行 
				{
					printf("\n");
				}
			}
		}
	}
	
	return 0;
}

 

三.  搬砖问题 

 

(1)问题叙述:搬砖问题。某工地需要搬运砖块,已知男人一人搬 3 块,女人一人搬 2块,小孩两人搬1块。如果想用n人正好搬n块砖,问有哪些搬法。

(2)问题分析:用枚举的思路,枚举对象是男人、女人和小孩的人数,将其分别设为变量 men、women和 children,以总人数 men+women+children ==n 和搬砖总数 men *3+women *2+children/2==n为判定条件,变量的取值范围都是[0,n]。3 个变量在各自的取值范围内遍历,采用三重循环嵌套,找出所有满足条件的解。

(3)源程序:

#include 
int main()
{
	int children, cnt, men, n, women;
	printf("Enter n:");
	scanf("%d", &n);
	cnt=0;
	for (men=0; men<=n; men++)
	{
		for (women=0; women<=n; women++)
		{
			for (children=0; children<=n; children++)
			{
				if((men+women+children==n)&&(men*3+women*2+children*0.5==n))
				{
					printf("men=%d, women=%d, children=%d\n", men, women, children);
					cnt++;
				}
			}
		}
	}
	if (cnt==0)
	{
		printf("None!\n");
	}
	
	return 0;
 } 

 

感谢老铁的浏览,希望老铁可以一键三连加个关注,您的支持和鼓励是我前进的动力,后续会分享更多学习编程的内容。 

 

###C语言程序设计-----C语言学习(8)## 斐波那契数列问题,素数问题,人数分配问题。_第2张图片 

 

 

你可能感兴趣的:(C语言程序设计,c语言,学习,开发语言,算法,数据结构,c++,c#)