C练习4.17

题目1:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

个人总结:寻找规律

#include <stdio.h>

int rabbit(int n);

void main ()
{
    int n, m;
    printf("你需要查询第几个月兔子数:");
    scanf("%d", &n);
    m=rabbit(n);
    printf("第%d个月兔子数量为%d\n", n, m);
        
} 
int rabbit(int n)
{
    if (n <= 0)
    {
        printf("error");
        return 0;
    }

    if(n==1 || n==2)
        return 1;
    if (n > 2)
       return rabbit(n-1)+rabbit(n-2);
}



题目2:判断101-200之间有多少个素数,并输出所有素数。

个人总结:素数=质数,指大于1的自然数中,除了1和此整数外,没法被其他自然数整除的数。1和0既非素数也非合数。

#include"stdio.h"
#include"math.h"
void main()
{
	int m, n, i, found;
	float t;

    n = 0;

	for(m = 101; m <= 200; m++){
		t = sqrt(m);

		for(i = 2; i <= t; i++){
			if(m%i ==0){
				found = 0;
				break;
			}
			else 
				found = 1;
		}

		if(found){
			printf("%d ", m);
			n++;
		}
	}

	printf("\n%d\n", n);
}


题目3:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。

#include"stdio.h"

void main()
{
	int m, a, b, c;
	
	for(m = 100;m <= 999; m++){
		a = m/100;
		b = m/10%10;
		c = m%10;

		if(m == (a*a*a +b*b*b +c*c*c))
			printf("%d ", m);		
	}
	printf("\n");
}


题目4:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

个人总结:前面输出为x*,最后一个要判断他是否已经是素数了,是就直接输出。

#include"stdio.h"
#include"math.h"

int check(int x);

void main()
{
	int x, i, n;
	printf("please input a numble:");
	scanf("%d",&x);
	printf("%d=",x);

	n = x;
	i = 2;

	while(check(x) != 1){

   		while(x%i == 0){
			printf("%d*",i);
				x = x/i;
		}
			i++;
	}

	printf("%d\n", x);
}


int check(int x)
{
	int t, i, found;
	t = sqrt(x);

		for(i = 2; i <= t; i++){
			if(x%i ==0){
				found = 0;
				break;
			}
			else 
				found = 1;
		}

		if(found)
			return 1;
		else
			return 0;

}



题目5:输入两个正整数m和n,求其最大公约数和最小公倍数。

个人总结:辗除法比穷举法更高效!

①第一种解法,利用穷举

#include"stdio.h"

int maxGY(int m, int n);
int minGB(int m, int n);

void main()
{
	int m, n, a, b;

	printf("please input m, n:");
	scanf("%d %d", &m, &n);

	a = maxGY(m, n);
	b = minGB(m ,n);

	printf("最大公约数为:%d\n最小公倍数为:%d\n", a, b);
}


int maxGY(int m, int n)
{
	int t, maxgy;

	//m > n
	if(m < n){
		t = m;
		m = n;
		n = t;
	}

    t = n;
	while((m%t != 0) || (n%t != 0))
		t--;

	return t;
}

int minGB(int m, int n)
{
	int t;

	//m > n
	if(m < n){
		t = m;
		m = n;
		n = t;
	}

	t = m;
	while((t%m != 0) || (t%n != 0))
		t++;

	return t;
}

②第二种解法:利用辗除法

#include"stdio.h"

int gcd(int m, int n);

void main()
{
	int m, n, a, b;
	printf("请输入两个数:");
	scanf("%d %d", &m, &n);

	a = gcd(m, n);
	b = m*n/a;

	printf("最大公约数为:%d\n最小公倍数为:%d\n", a, b);
}

int gcd(int m, int n) {
	int temp;
    if(m < n) {
        temp = n;
        n = m;
        m = temp;
    }
    if(m%n == 0)
        return n;
    else {
        m %= n;
        return gcd(n, m);
    }
}


题目6:利用条件运算符((a>b)?a:b)的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

#include"stdio.h"
#define N 100;

void main()
{
	int x;
	scanf("%d",&x);

	if((x >= 0) && (x <= 100)){
		(x >= 90)? printf("A\n"):((x < 60)?  printf("C\n"):printf("B\n"));
	}
	
	else
		printf("error");
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值