穷举法
也成枚举法,基本思想是:首先依据题目的部分条件确定答案的大致范围,然后对此范围内的所有可能的情况进行逐一验证,知道全部情况验证完毕,若某个情况验证符合题目条件,则为本题的一个答案,若全部情况都验证完后均不符合题目条件,则本题无解。
百钱买白鸡,这是一个经典的不定方程求解问题。问题如下:公鸡5元一只,母鸡3元一只,小鸡1元三只。问:用100元钱买100只鸡,公鸡,母鸡,小鸡各买多少只?
题目分析:
假设,公鸡g只,母鸡m只,小鸡x只。
g+m+x=100
5g+3m+x/3=100
可以采用穷举法来求解。
取值范围为:0<=g<=20
0<=m<=33
0<=x<=100
int main() { int g,m,x; for(g=0;g<=20;g++) { for(m=0;m<=33;m++) { x=100-g-m; if(15*g+9*m+x==300) { printf("%4d %4d %4d\n",g,m,x); } } } return 0; }
递推法
从已知条件出发,逐步推出题目所要求的各中间结果和最后结果的算法即为递推法。
求n!
题目分析:
n!=n(n-1)!
首先计算出1!,计算2*1!,则推出2!,进一步推出3!,4!,。。。。n!
int main() { int n,i; int sum=1; int flag=1; scanf("%d",&n); for(i=1;i<=n;i++) { sum*=flag*i; } printf("%d\n",sum); return 0; }
求菲波那切数列的第n项。这个数列有如下特点,第1,第2个数为1,从第3个数开始,每个数是前两个数之和,其数列为:1,1,2,3,5,8,.........
题目分析:
f1=1 n=1
f2=1 n=2
f3=f1+f2 n>=3
#include<stdio.h> int main() { int f1=1,f2=1,f3; int i,n; scanf("%d",&n); for(i=3;i<=n;i++) { f3=f2+f1; f1=f2; f2=f3; } printf("%d\n",f3); return 0; }