《C语言的科学与艺术》课后习题答案第六章(部分)

6.2//素数分解,并显示各因子,列60,2*2*3*5

#include <stdio.h>
#include <genlib.h>
#include <simpio.h>
#include <math.h>

bool IsPrime(int n);
void PrintPrime(int num);

void main()
{
int num;
printf("请输入要分解的数:");
num=GetInteger();
if (num<=1)
{
printf("输入有误!请输入要分解的数:");
num=GetInteger();
else
{
if (IsPrime(num))
{
printf("%d=1*%d",num,num);
else
{
PrintPrime(num);
}
}
printf("\n");
}

bool IsPrime(int n)
{
int i,limit;

if (n<=1)
{
return (FALSE);
}
if (n==2)
{
return (TRUE);
}
if (n%2==0)
{
return (FALSE);
}
limit=sqrt(n)+1;
for(i=3;i<=limit;i+=2)
{
if (n%i==0)
{
return (FALSE);
}
}
return (TRUE);
}

void PrintPrime(int num)
{
int i=2;

if (IsPrime(num))
{
printf("%d",num);
else
{
while(i<num)
{
if (num%i==0)
{
printf("%d*",i);
PrintPrime(num/i);
break;
else
{
i++;
}
}
}
}

6.3//打印1~9999之间的完全数,完全数是指其真约数(除其本身以外的约数)之和等于其本身的数。

#include <stdio.h>
#include <genlib.h>
#include <math.h>

bool IsPerfect(int n);               //判断完全数的函数

void main()
{
int i,j=0;                           //i是循环变量,j控制格式换行用

printf("本程序的目的是打印1~9999之间的完全数!\n");
for (i=1;i<10000;i++)
{
if (IsPerfect(i))
{
printf("]",i);
j++;
if (j!=0 && j%2==0)
{
printf("\n");
}
}
}
}

//方法一
 

//方法二

bool IsPerfect(int n)
{
int sum=1,i,limit;
limit=sqrt(n)+1;
for(i=2;i<limit;i++)
{
if (n%i==0)
{
sum+=i+n/i;
}
}
if (sum==n&&sum!=1)
{
return (TRUE);
else
{
return (FALSE);
}
}

6.5//求立方根,由sqrt的牛顿算法演化二来

#include <stdio.h>
#include <simpio.h>
#include <genlib.h>
#include <math.h>

#define Epsilon 0.000001

bool ApproximatelyEqual(double x,double y);
double CubeRoot(double x);
double Min(double a,double b);


void main()
{
double n;
printf("本程序从使用者那里读取一个数字,然后输出该数字的立方根!\n");
printf("请输入要计算的数字:");
n=GetReal();
printf("%f的立方根是:%.4f\n",n,CubeRoot(n));
}

double CubeRoot(double x)
{
double g;

if (x==0)
{
return (0);
}
g=x;
while(!ApproximatelyEqual(x,g*g*g))
{
g=(2*g+x/g/g)/3;                         //立方根牛顿算法
}
return (g);
}

bool ApproximatelyEqual(double x,double y)
{
if (fabs(x-y)/Min(fabs(x),fabs(y))<Epsilon)
{
return TRUE;
else
{
return FALSE;
}
}

double Min(double a,double b)
{
if (a>=b)
{
return (b);
else
{
return (a);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值