C语言经典例题100,8~16

八、输出9*9口诀。

#include<stdio.h>

int main()
{
    int r[9]={1,2,3,4,5,6,7,8,9};
    int c[9]={1,2,3,4,5,6,7,8,9};
    int i,j;

    printf("0\t1\t2\t3\t4\t5\t6\t7\t8\t9\n");
    for(i=1;i<10;i++)
    {
        printf("%d",i);
        for(j=1;j<10;j++)
            printf("\t%d",r[i-1]*c[j-1]);
        printf("\n");
    }
    getch();
    return 0;
}

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

程序分析:每个月新增的兔子对数取决于上上个月的兔子对数;假设第i月有x只兔子,设第(i+1)个月有y只兔子,则第(i+2)个月比第(i+1)个月新增兔子数量为x,即(x+y)只兔子;

归纳为:F(i+2)=F(i+1)+F(i);

同时本题中F(1)=F(2)=2;因此本题可用递归方法解决。

#include<stdio.h>

int F_rabbit(unsigned int x)
{
    if(x==0) return 0;
    if(x==1||x==2) return 2;
    else return F_rabbit(x-1)+F_rabbit(x-2);
}
int main()
{
    int month_num;
    printf("请输入第几个月:\n");
    scanf("%d",&month_num);
    printf("第%d个月总共有%d只兔子。\n",month_num,F_rabbit(month_num));
    getch();
    return 0;
}

十二、判断101-200之间有多少个素数,并输出所有素数。

#include<stdio.h>

int Is_Prime(int x)
{
    int i;
    for(i=2;i<=(x/2);i++)
        if(x%i==0)
            break;
    if(i==x/2+1)
        return 1;
    else
        return 0;
}

int main()
{
    int x,n=0;
    int Is_Prime(int);
    for(x=101;x<201;x++)
    {
        if(Is_Prime(x))
        {
            printf("\t%d",x);
            n++;
            if(n%5==0)
                printf("\n");
        }
    }
    printf("\n101~200之间共有%d个素数。\n",n);
    getch();
    return 0;
}

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

#include<stdio.h>

int main()
{
    int a,b,c;
    for(a=1;a<10;a++)
        for(b=1;b<10;b++)
            for(c=1;c<10;c++)
                if((a*a*a+b*b*b+c*c*c)==(100*a+10*b+c))
                    printf("\t%d",100*a+10*b+c);
    getch();
    return 0;
}

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

程序分析:非质数的正整数的最小因数必为其最小的质因数,先求其最小质因数,在求原数除去这个最小质因数的最小质因数,以此类推,直至除运算后商为质数为止。

因此,设计一个可以返回最小质因数的函数,并循环调用它。

#include<stdio.h>

int min_pfactor(int x)
{
    int i;
    if(x<=3)
        return 0;
    for(i=2;i<=x/2;i++)
        if(x%i==0)
            break;
    if(i==(x/2+1))
        return 0;
    else 
        return i;
}

int main()
{
    int x,a;
    printf("请输入一个正整数:\n");
    scanf("%d",&x);
    if(!min_pfactor(x))
    {
        printf("你输入的是一个素数!\n");
        getch();
        return 0;
    }
    else
    {
        printf("分解质因数为:%d=",x);
        while(a=min_pfactor(x))
        {
            printf("%d*",a);
            x=x/a;
        }
        printf("%d",x);
        getch();
        return 0;
    }
}
    
            

十五、利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

#include<stdio.h>

int main()
{
    int score;
    printf("please input the score:\n");
    scanf("%d",&score);
    printf("level is:%c",(score>=90)?'A':((score<60)?'C':'B'));
    getch();
    return 0;
}

十六、输入两个正整数m和n,求其最大公约数和最小公倍数。

#include<stdio.h>

int max_factor(int a,int b)
{
    if(!b)
        return a;
    else
        return max_factor(b,a%b);
}

int main()
{
    int m,n;
    printf("请从大到小依序输入两个正整数:\n");
    scanf("%d%d",&m,&n);
    printf("%d和%d的最小公约数为%d,最大公倍数为%d",m,n,max_factor(m,n),m*n/(max_factor(m,n)));
    getch();
    return 0;
}