前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。
今天,我们主要分享三个问题如何用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 <stdio.h>
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 <stdio.h>
#include <math.h>
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 <stdio.h>
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;
}
感谢老铁的浏览,希望老铁可以一键三连加个关注,您的支持和鼓励是我前进的动力,后续会分享更多学习编程的内容。