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);
}
}