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