计算机导论第六周答案参考

6-6 实验5_10_设计函数judgeTriangle

  1. 解题思路
    这是一道函数题,只需要设计出int judgeTriangle(int a,int b,int c)这个函数即可。

    根据裁判程序:

     #include<stdio.h>
    
     int judgeTriangle(int,int,int) ; 
    
     int main(){
         int a, b, c ;    
         scanf("%d%d%d",&a,&b,&c);
         switch(judgeTriangle(a,b,c)){
             case -1:
                 printf("It is not a triangle.\n") ;break ;
             case 0 :
                 printf("It is a scalenous triangle.\n") ;
                 break ;
             case 1 :
                 printf("It is a right-angled triangle.\n") ;
                 break ;
             case 2 :
                 printf("It is an isosceles triangle.\n") ;
                 break ;
             case 3 :
                 printf("It is a equilateral triangle.\n") ;
                 break ;
         }
         return 0;
     }
    
     /* 请在这里填写答案 */
    

    结合题意,可知要设计的函数需要根据三角形的类型返回不同的值,用在switch结构中实现三角形类型的判断。

    • 非三角形(存在两条边长度之和小于等于第三条边),则返回-1;
    • 不规则三角形(三条边不相等且不是直角三角形),则返回0;
    • 直角三角形(三条边满足勾股定理),则返回1;
    • 等腰三角形(三条边有两条边相等),则返回2;
    • 等边三角形(三条边三条都相等),则返回3;

    因此,可以用嵌套的if语句结构实现三角形类型的判断并返回对应的值。

  2. C语言代码

int judgeTriangle(int a,int b,int c)
{
    int re;
    if (a+b<=c || a+c<=b ||b+c<=a||a<=0||b<=0||c<=0){//非三角形
        re = -1;
    }
    else{
        if (a!=b && b!=c && a!=c){//不规则或者是直角
            if(a*a+b*b==c*c||a*a+c*c==b*b||c*c+b*b==a*a)//直角
                re = 1;
            else//不规则
                re=0;
        }
        else if (a==b||a==c||b==c){
            if (a==b&&b==c)//等边
                re=3;
            else//等腰
                re=2;
        }  
    }
    return re;
}

6-11 实验6_4_二进制转十进制

  1. 解题思路
    根据题目的描述和归纳,递归结束条件是n=0或者n=1,而递归部分则不断调用自身,返回n%10+convert(n/10)*2 .
  2. C语言代码
int convert(int n){
    if(n==0||n==1){//递归结束条件
        return n;
    }
    else{//递归算法
        return n%10+convert(n/10)*2;
    }
}

6-16 实验6_9_素数分解

  1. 解题思路
    题目中涉及到一个数学定理——算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为素数(质数)的积,而且这些素数因子按大小排列之后,写法仅有一种方式。

    因此,首先要找到对应的素数因子,之后将这些因子格式化输出。

    • 素数因子的判断可以遍历i∈[2~n-1],通过n/i是不是等于0来判断i是不是因子,如果是因子,还需要判断i是不是素数,如果是则输出,不是则下一轮循环。
    • 因子输出的格式是待判断的数=素因子1*素因子2*素因子3*……*素因子k
      • 待判断的数=”这部分是在递归调用的第一层实现,而后续递归调用的过程中不需要输出该部分;
      • 素因子1*素因子2*素因子3*……*素因子k这部分需要在递归调用的每一层输出,但是对于第一个因子或者最后一个因子需要特殊考虑,按照素因子1*素因子2*素因子3*……*素因子k,\n或者素因子1*素因子2*素因子3*……*素因子k的方式输出
    • 素数的判断:遍历2~n-1,如果存在某个数能够整除n,那么n不是素数。
  2. C语言代码

int isPrime(int n){//判断n是不是素数,1表示是素数,-1表示不是素数
    for(int j=2;j<n;j++){
        if(n%j==0)//已经可以判断n不是素数
            return -1;
    }
    return 1;//n是素数
}
void printFactor(x,y){//按照格式打印x的素因子
    if(y==1)
        printf("%d=",x);
    if(isPrime(x)==1){//x本身就是一个素数,说明是最后一个素数因子
        printf("%d\n",x);
        return;
    }
    int judge=-1;
    for(int i=2;i<x;i++){//
        if(isPrime(i)==1&&x%i==0){
            judge=i;
            break;
        }
    }
    if(judge!=-1){
        printf("%d*",judge);
        printFactor(x/judge,-1);
    }
    return;
}

函数的大致框架类似于:
void func(int x,int y){
    if(y==1){
        printf("%d=",x);
    }
    if(isPrime(x)==1){//x是质数,达到递归的退出条件
        printf("%d",x);
    }
    else{//继续递归
        for(int i=2;i<x;i++){
            if(x/i==0 && isPrime(i)==1){//找到素数因子
                printf("%d*",i);
                break;
            }
        }
        func(x/i,0);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值