7.3 用函数编程计算两个函数最大值
#include <stdio.h>
int max(int a,int b){
if(a>b)
return a;
else
return b;
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("最大值为%d",max(a,b));
return 0;
}
7.4 采用穷举法,用函数编程实现计算两个正整数的最小公倍数。
#include <stdio.h>
int LCM(int a,int b){
int i;
for(i=1;i<=a*b;i++)
{
if(i%a==0&&i%b==0)
break;
}
return i;
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("最小公倍数为%d",LCM(a,b));
return 0;
}
7.5 利用阶乘函数Fact(),编程计算并输出1到n之间所有数的阶乘值。
#include <stdio.h>
long Fact(int n){
static long p=1;
p=p*n;
return p;
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++){
printf("%d!=%ld\n",i,Fact(i));
}
return 0;
}
7.6 利用阶乘函数Fact(),编程计算并输出1到n之间所有数的阶乘值之和
#include <stdio.h>
long Fact(int n){
static long p=1;
p=p*n;
return p;
}
int main()
{
int n,i;
long sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum+=Fact(i);
}
printf("阶乘和为%ld",sum);
return 0;
}
7.7 求解最大公约数的三种方法
#include <stdio.h>
//穷举法
int GCD1(int a,int b)
{
int min=a<b?a:b,i;
for(i=min;i>=1;i--){
if(a%i==0&&b%i==0)
break;
}
return i;
}
//判断并交换a、b的值,使a>=b
void swap(int &a,int &b) {
int temp;
if(a<b){
temp=a;
a=b;
b=temp;
}
}
//欧几里得算法(辗转相除法)
int GCD2(int a,int b){
swap(a,b);
int r=a;//余数
while(r!=0) {
r=a%b;
a=b;
b=r;
}
return a;//返回除数
}
//递归法
int GCD3(int a,int b) {
swap(a,b);
if(a==b) return a;
return GCD3(a-b,b);
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("最大公约数为%d",GCD1(a,b));
printf("最大公约数为%d",GCD2(a,b));
printf("最大公约数为%d",GCD3(a,b));
return 0;
}
7.8 5水手分椰子
5个水手在岛上发现一堆椰子,先由第1个水手把椰子分为等量的5堆,还剩下1个给了猴子,自己藏起1堆。然后,第2个水手把剩下的4堆混合后重新分为等量的5堆,还剩下1个给了猴子,自己藏起1堆。以后第3、4个水手依次按此方法处理。最后,第5个水手把剩下的椰子分为等量的5堆后,同样剩下1个给了猴子。请用迭代法编程计算并输出原来这堆椰子至少有多少个。
假设初始有n个椰子,
人\ 总数 每堆椰子数 分完还剩
1 n (n-1)/5 n - 1-(n-1)/5
2 (4/5)*(n-1) [ (4/5)*(n-1) -1]/5 n - 1-(n-1)/5 -1 - [ (4/5)*(n-1) -1]/5
#include<stdio.h>
int main()
{
int n=1,y=1,sum=0;//n 人数 y 每次分椰子的总数 sum 总的椰子数
while(n<=5){ //给每个人分椰子
if(y%5==1&&y/5!=0){//分椰子成功
y=(y/5)*4;
n++; //下一个人
}
else{
sum++; //重新计算 ,初始椰子数加一
y=sum;
n=1;
}
}
printf("至少有 %d个椰子",sum);
}
7.9 第5个人的年龄
有5个人围坐在一起,问第5个人多大年纪,他说比第4个人大2岁;问第4个人,他说比第3个人大2岁;问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁。 第1个人说自己10岁,请利用递归法编程计算并输出第5个人的年龄。
#include <stdio.h>
int age(int n){
if(n==1) return 10;
else return age(n-1)+2;
}
int main()
{
int n;
printf("第五个人的年龄为%d",age(5));
return 0;
}
7.10 室内互动游戏 猜数字
在一种室内互动游戏中,魔术师要每位观众心里想一个3位数abc(a、b、c分别是百位、十位和个位数字),然后魔术师让观众心中记下acb、bac、bca、cab、cba五个数以及这五个数的和值。 只要观众说出这个和是多少,则魔术师一定能猜出观众心里想的原数abc是多少。 例如观众甲说他计算的和值是1999,则魔术师立即说出他想的数是443,而观众乙说他计算的和值是1998,则魔术师说:“你算错了! ”。
#include <stdio.h>
void guess(int n){
int a,b,c,i;
for(i=100;i<1000;i++){
a=i/100;
b=(i-100*a)/10;
c=i%10;
if(100*a+10*c+b+100*b+10*a+c+100*b+10*c+a+100*c+10*a+b+100*c+10*b+a==n)
{
printf("%d",a*100+b*10+c);
return;//直接返回,不带任何返回参数。适用于void 类型的函数
}
}
printf("你算错了!");
return ;
}
int main()
{
int n;
scanf("%d",&n);
guess(n);
return 0;
}
7.12 汉诺塔(Hanoi)
汉诺塔是必须用递归方法才能解决的经典问题,它来自于印度神话。上帝创造世界时造了3根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放到第二根柱子上,并且规定每次只能移动一个圆盘,在小圆盘上不能放大圆盘。 问:试编写,求解 n(n>1)个圆盘的汉诺塔问题。
思路:
假设总共需要移动n个盘子
1.将A上的n-1个盘子借助C移到B
2.将A上最后一个盘子移到C
3.将B上的n-1个盘子借助A移到C
#include <stdio.h>
void Hanoi(int n,char a,char b,char c){
if(n==1) printf("%c->%c\n",a,c);
else{
Hanoi(n-1,a,c,b);
printf("%c->%c\n",a,c);
Hanoi(n-1,b,a,c);
}
}
int main()
{
int n;
scanf("%d",&n);
Hanoi(n,'A','B','C');
return 0;
}