6-6 实验5_10_设计函数judgeTriangle
-
解题思路
这是一道函数题,只需要设计出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语句结构实现三角形类型的判断并返回对应的值。
-
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_二进制转十进制
- 解题思路
根据题目的描述和归纳,递归结束条件是n=0或者n=1,而递归部分则不断调用自身,返回n%10+convert(n/10)*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的自然数均可写为素数(质数)的积,而且这些素数因子按大小排列之后,写法仅有一种方式。因此,首先要找到对应的素数因子,之后将这些因子格式化输出。
- 素数因子的判断可以遍历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不是素数。
- 素数因子的判断可以遍历i∈
-
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);
}
}