没有合适的资源?快使用搜索试试~ 我知道了~
C语言经典题目及解题思路
4星 · 超过85%的资源 需积分: 50 18 下载量 65 浏览量
2009-09-16
06:22:51
上传
评论 1
收藏 167KB PDF 举报
温馨提示
试读
23页
C语言经典题目及解题思路 C语言经典题目及解题思路 C语言经典题目及解题思路 C语言经典题目及解题思路C语言经典题目及解题思路
资源推荐
资源详情
资源评论
本来是想写个《C 语言经典题目系列》,本系列包括一些经典算法题目,但由于时间问题,
现在只是收集了不多题目且只做了一部分,就先发上来了。写此目的帮助一些学 c 语言的
人入门及运用一些算法,由于水平有限错误在所难免及本来这些题目不是很难高手就不用
看了,其中错误欢迎大家指正。
1、
【问题描述】梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。编写一个程序,计算
共有多少中不同的走法
【思路】看到此题目容易想到用递归的方法来做,因为递归是一种描述和解决结构自相似
问题的基本算法,而 N 阶楼梯问题和 N-1 阶、N-2 阶的结构完全相同。
解决递归问题可以分为两个部分,第一部分是一些特殊(基础)情况,用直接法解,
即始基;第二部分与原问题相似,可用类似的方法解决(即递归),但比原问题的规模要小。
定义 int count(int n)函数求解 N 阶楼梯的走法,基于上述思想,可知:
[list][*]N 阶楼梯问题的始基是 N==1、N==2 两种情况;[*]上楼可以一步上一阶,也可以一
步上二阶,当上一阶时问题规模变为 N-1,当上二阶时问题规模变为 N-2,所以总的情况为
count(n-1)+count(n-2)。[/list]【代码】
[table=98%][tr][td]cCODE:
[/td][/tr][tr][td]#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:");
scanf("%d",&n);
ct=count(n);
printf("there are %d ways to climb up N steps stairs!",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);
}[/td][/tr][/table]【程序输入输出】for example
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 次方之和。[list][*]定义函数 int judgeDigit(int m),用于判
断给定参数 m 的位数;[*]定义函数 int judgeEqual(int m,int n),其中 m 为给定的数,n 为
m 的位数,用于判断 m 是否等于各位数的 n 次方之和。[/list]【代码】
[table=98%][tr][td]cCODE:
[/td][/tr][tr][td]
#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);
}
[/td][/tr][/table]【程序输入输出】
no input;
output:
All 2 digit to 5 digit Armstrong integers are following:
[color=Red]153[/color] 370 371 407 1634 8208 9474 54748
92727 93084
[color=Red]注:用 gcc 调试就得不到 153 这个结果,但 windows 下用 vc6.0 就可以得到。不
解中,这是编译器问题还是程序问题?[/color]
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)用枚举法。
[list][*]定义函数 int judge(int n),用于判断整数 n 的各位数字是否相同,如果有想同的就返
回 0;否则返回 1;[*]对每个数 n(123<=n<=329),2*n,3*n 调用 judge()函数用于判断这三
个数是否由 1~9 组成且各个数字不相同;[*]判断 n,2*n,3*n 这三个数中的各位数是否相
同,所以对数 n*1000*1000+2*n*1000+3*n 调用 judge() 判断。[/list] 所以
(judge(n)==0||judge(2*n)==0||judge(3*n)==0||judge(n*1000+2*n*100+3*n)==0)为真的话,即
其中给定的 n 不符合要求。[color=#ff0000] 其实只要
([/color]judge(n*1000+2*n*100+3*n)==0[color=#ff0000])这一个条件即可,因为它包含了前
面两种情况。 [/color]
[color=#ff0000]caution:其实要判断这三个数是否由 1~9 组成且各个数组不相同,即这
三个数的各位数是否覆盖了 1~9,只要判断各位数字的积是否等于 9!且各位数字的和是否
等于 45。
[/color]【代码】
[table=98%][tr][td]cCODE:
[/td][/tr][tr][td]#include<stdio.h>
#include<stdlib.h>
int judge(int n);
int main (int argc, char **argv)
{
int l,m,n,p,q;
for(l=123;l<=329;l++)
{
m=2*l,n=3*l;
p=l*1000+m,q=p*1000+n;
if(judge(q)==0)
//判断 l、m、n 是否符合要求。如果不符合就跳出本次循环,进入下次循环
continue;
printf("%d,%d,%d\n",l,m,n);
}
system("PAUSE");
return 0;
}
int judge(int n)
{//用于判断整数 n 的各位数字是否相同,如果有想同的就返回 0;否则返回 1
int num[10],i,j,len=0,temp=n;
do
{
++len;
temp=temp/10;
}while(temp);//求出 n 的位数
for(i=1;i<=len;i++)
{//将 n 的各位数字存入 num[],并判断是否存在 0 及相同的数字,如果存在就返回 0
if((num=n%10)==0)
return 0;
n=n/10;
for(j=1;j<i;j++)
if(num[j]==num)
return 0;
}
return 1;
}[/td][/tr][/table]
[table=98%][tr][td]cCODE :来自一位网友
[url=http://bbs3.chinaunix.net/profile-uid-20771611.html][font=Fixedsys][color=#0000ff]you
shuang[/color][/font],即用[color=#ff0000][color=#000000]判断各位数字的积是否等于 9!
且各位数字的和是否等于 45。[/color][/color][color=#000000])[/color]
[/td][/tr][tr][td]#include <stdio.h>
bool judge( int a, int b, int c )
{
char tmp_buf[ 10 ];
sprintf( tmp_buf, "%d%d%d", a, b, c );
int nTimeResult = 1;
int nSumResult = 0;
for ( int i = 0; i < 9; i++ )
{
nTimeResult *= ( tmp_buf[ i ] - '0' );
nSumResult += ( tmp_buf[ i ] - '0' );
}
return ( ( nTimeResult == 362880 ) && ( nSumResult == 45 ) );
}
int main()
{
for ( int i = 123; i <= 329; i++ )
{
if ( judge( i, i * 2, i * 3 ) )
{
printf( "%d, %d, %d \n", i, i * 2, i * 3 );
}
}
return 0;
}[/td][/tr][/table]【程序输入输出】
no input;
output:
192,384,576
219,438,657
273,546,819
327,654,981
4、
【问题描述】和尚挑水
某寺庙里 7 个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表:
和尚 1: 星期二,四;
和尚 2: 星期一,六;
和尚 3: 星期三,日;
和尚 4: 星期五;
剩余22页未读,继续阅读
资源评论
- chendelong842012-12-05还行~~,可以用
tjx163
- 粉丝: 18
- 资源: 392
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功