本来是想写个《C语言经典题目系列》,本系列包括一些经典算法题目,但由于时间问题,现在只是收集了不多题目且只做了一部分,就先发上来了。写此目的帮助一些学c语言的人入门及运用一些算法,由于水平有限错误在所难免及本来这些题目不是很难高手就不用看了,其中错误欢迎大家指正。
1、
【问题描述】梯有N阶,上楼可以一步上一阶,也可以一步上二阶。编写一个程序,计算共有多少中不同的走法
【思路】看到此题目容易想到用递归的方法来做,因为递归是一种描述和解决结构自相似问题的基本算法,而N阶楼梯问题和N-1阶、N-2阶的结构完全相同。
解决递归问题可以分为两个部分,第一部分是一些特殊(基础)情况,用直接法解,即始基;第二部分与原问题相似,可用类似的方法解决(即递归),但比原问题的规模要小。
定义int count(int n)函数求解N阶楼梯的走法,基于上述思想,可知:
- N阶楼梯问题的始基是N==1、N==2两种情况;
- 上楼可以一步上一阶,也可以一步上二阶,当上一阶时问题规模变为N-1,当上二阶时问题规模变为N-2,所以总的情况为count(n-1)+count(n-2)。
【代码】
cCODE: |
#include<stdio.h> #include<stdlib.h> int count(int n); /*count how many ways to climb up N steps stairs.*/ int main (int argc, char *argv[]) { int n,ct; printf("please input n:/n"); scanf("%d",&n); ct=count(n); printf("there are %d ways to climb up N steps stairs!/n",ct); system("PAUSE"); return 0; } int count(int n) { if(1==n) return 1; else if(2==n) return 2; else return count(n-1)+count(n-2); } |
please input n:
5
there are 8 ways to climb up N steps stairs!
2、
【问题描述】Armstrong数具有如下特征:一个n位数等于其个位数的n次方之和。如:
153=13+53+33
1634=14+64+34+44
找出2、3、4、5位的所有Armstrong数。
【思路】看到此题我第一反应是用枚举法,给定m(10<=m<=99999),首先判断m的位数n,然后判断它是否等于各位数的n次方之和。
- 定义函数int judgeDigit(int m),用于判断给定参数m的位数;
- 定义函数int judgeEqual(int m,int n),其中m为给定的数,n为m的位数,用于判断m是否等于各位数的n次方之和。
【代码】
cCODE: |
#include<stdio.h> #include<stdlib.h> #include<math.h> int judgeDigit(int m); /*This function return the digit of parameter m*/ void judgeEqual(int m,int n); /*parameter m is a integer,parameter n is the digit of m,this function is used to judge m whether is a Armstrong integer and output it*/ int main (int argc, char **argv) { int i,len; printf("All 2 digit to 5 digit Armstrong integers are following:/n"); for(i=10;i<=99999;i++) { len=judgeDigit(i); judgeEqual(i,len); } printf("/n"); system("PAUSE"); return 0; } int judgeDigit(int m) {/*This function return the digit of parameter m*/ int len=0; do { ++len; m=m/10; }while(m); return len; } void judgeEqual(int m,int n) {/*parameter m is a integer,parameter n is the digit of m,this function is used to judge m whether is a Armstrong integer and output it*/ int j,temp=m,sum=0; for(j=1;j<=n;j++) { sum+=(int)(pow(temp%10,n)); temp=temp/10; } if(m==sum)/*if m is equal to sum,that is to say m is a Armstrong integer*/ printf("%d/t",m); } |
no input;
output:
All 2 digit to 5 digit Armstrong integers are following:
153 370 371 407 1634 8208 9474 54748 92727 93084
注:用gcc调试就得不到153这个结果,但windows下用vc6.0就可以得到。不解中,这是编译器问题还是程序问题?
3、
【问题描述】将1,2,3,4,5,6,7,8,9共9个数分成三组,组成3个三位数,且使这3个三位数构成1:2:3的比例,例如:3个三位数192,384,576满足以上条件.192:384:576=1:2:3。试求出所有满足条件的3个三位数。
【思路】1~9组成的最小三位数是123,最大的是987,由于要满足1:2:3的关系,最小的那个数应该不到于987/3=329。这样的话第一个数的变化范围是123~329,将这里面的数分别乘2、乘3,然后判断这三个数是否符合要求,即这三个数是否由1~9组成,而且各个数字不能相同。
即对每个数n(123<=n<=329)用枚举法。