作者在 2012-02-24 15:05:38 发布以下内容
5.3 输入两个正整数m和n,求其最大公约数和最小公倍数
/*
时间:2011年10月24日12:13:07
题目:习题5-3 输入两个正整数m和n,求其最大公约数和最小公倍数
备注:最小公约数(Least Common Multiple)简写为LCM;最大公约数(greatest common divisor,简写为gcd
*/
# include <stdio.h>
int lcm (int x,int y);
int gcd (int x,int y);
int main()
{
int a,b;
int t;
printf("输入两个正整数:");
scanf("%d%d",&a,&b);
if(a>b)
{
t=a;
a=b;
b=t;
}
printf("最小公倍数是%d\n",lcm(a,b));
printf("最大公约数是%d\n",gcd(a,b));
return 0;
}
//求最小公倍数
int lcm (int x,int y)
{
int n=1;
int lcm;
for(lcm=x;0!=lcm%y;++n)
{
lcm = n*x;
}
return (lcm);
}
//求最大公约数
int gcd (int x,int y)
{
int t;
while(x!=0)
{
t = y%x;
y = x;
x = t;
}
return(y);
}
/*
在VC++6.0中的输出结果为:
————————————
输入两个正整数:12 18
最小公倍数是36
最大公约数是6
Press any key to continue
————————————
*/
时间:2011年10月24日12:13:07
题目:习题5-3 输入两个正整数m和n,求其最大公约数和最小公倍数
备注:最小公约数(Least Common Multiple)简写为LCM;最大公约数(greatest common divisor,简写为gcd
*/
# include <stdio.h>
int lcm (int x,int y);
int gcd (int x,int y);
int main()
{
int a,b;
int t;
printf("输入两个正整数:");
scanf("%d%d",&a,&b);
if(a>b)
{
t=a;
a=b;
b=t;
}
printf("最小公倍数是%d\n",lcm(a,b));
printf("最大公约数是%d\n",gcd(a,b));
return 0;
}
//求最小公倍数
int lcm (int x,int y)
{
int n=1;
int lcm;
for(lcm=x;0!=lcm%y;++n)
{
lcm = n*x;
}
return (lcm);
}
//求最大公约数
int gcd (int x,int y)
{
int t;
while(x!=0)
{
t = y%x;
y = x;
x = t;
}
return(y);
}
/*
在VC++6.0中的输出结果为:
————————————
输入两个正整数:12 18
最小公倍数是36
最大公约数是6
Press any key to continue
————————————
*/
5.4 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数
/*
时间:2011年10月24日13:48:26
题目:习题5-4 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数
*/
# include <stdio.h>
int main()
{
int space=0;
int number=0;
int letters=0;
int other=0;
char c;
printf("输入一串字符:");
while((c=getchar())!='\n')
{
if((65<=c && c<=90) || (97<=c && c<=122))
{
++letters;
}
else if(32==c)
{
++space;
}
else if(48<=c && c<=57)
{
++number;
}
else
{
++other;
}
}
printf("空格有%d个\n",space);
printf("数字有%d个\n",number);
printf("字母有%d个\n",letters);
printf("其他字符有%d个\n",other);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入一串字符:Bccn 2011.11.24
空格有1个
数字有8个
字母有4个
其他字符有2个
Press any key to continue
————————————
*/
时间:2011年10月24日13:48:26
题目:习题5-4 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数
*/
# include <stdio.h>
int main()
{
int space=0;
int number=0;
int letters=0;
int other=0;
char c;
printf("输入一串字符:");
while((c=getchar())!='\n')
{
if((65<=c && c<=90) || (97<=c && c<=122))
{
++letters;
}
else if(32==c)
{
++space;
}
else if(48<=c && c<=57)
{
++number;
}
else
{
++other;
}
}
printf("空格有%d个\n",space);
printf("数字有%d个\n",number);
printf("字母有%d个\n",letters);
printf("其他字符有%d个\n",other);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入一串字符:Bccn 2011.11.24
空格有1个
数字有8个
字母有4个
其他字符有2个
Press any key to continue
————————————
*/
5.5 求Sn=a+aa+aaa+。。。aaaaa(n个a,)其中a是一个数字,n表示a的位数,例如:2+22+222+2222+22222
/*
时间:2011年10月24日14:09:19
题目:习题5-5 求Sn=a+aa+aaa+。。。aaaaa(n个a,)其中a是一个数字,n表示a的位数
*/
# include <stdio.h>
int main()
{
int a,n;
int sn=0;
int term=0,i;
printf("输入a和n的值:\n");
printf("a=");
scanf("%d",&a);
printf("n=");
scanf("%d",&n);
for(i=1;i<=n; ++i)
{
term = 10*term + a;
sn += term;
}
printf("当a=%d,n=%d时,sn=%d\n",a,n,sn);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入a和n的值:
a=2
n=5
当a=2,n=5时,sn=24690
Press any key to continue
————————————
*/
时间:2011年10月24日14:09:19
题目:习题5-5 求Sn=a+aa+aaa+。。。aaaaa(n个a,)其中a是一个数字,n表示a的位数
*/
# include <stdio.h>
int main()
{
int a,n;
int sn=0;
int term=0,i;
printf("输入a和n的值:\n");
printf("a=");
scanf("%d",&a);
printf("n=");
scanf("%d",&n);
for(i=1;i<=n; ++i)
{
term = 10*term + a;
sn += term;
}
printf("当a=%d,n=%d时,sn=%d\n",a,n,sn);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入a和n的值:
a=2
n=5
当a=2,n=5时,sn=24690
Press any key to continue
————————————
*/
5.6 求1!+2!+3!+…..+20!
/*
时间:2011年10月24日14:39:40
题目:求1!+2!+3!+…..+20!
*/
# include <stdio.h>
double factoria (int x);
int main()
{
int max=20;
int i;
double sn=0; //注意这里用double型
for (i=1; i<=max; ++i)
{
sn += factoria(i);
}
printf("sn=%22.15e\n",sn);
return 0;
}
double factoria (int x)
{
int i;
double factoria=1;
for(i=1; i<=x; ++i)
{
factoria *= i;
}
return (factoria);
}
/*
在VC++6.0中的输出结果为:
————————————
sn=2.561327494111820e+018
Press any key to continue
————————————
*/
时间:2011年10月24日14:39:40
题目:求1!+2!+3!+…..+20!
*/
# include <stdio.h>
double factoria (int x);
int main()
{
int max=20;
int i;
double sn=0; //注意这里用double型
for (i=1; i<=max; ++i)
{
sn += factoria(i);
}
printf("sn=%22.15e\n",sn);
return 0;
}
double factoria (int x)
{
int i;
double factoria=1;
for(i=1; i<=x; ++i)
{
factoria *= i;
}
return (factoria);
}
/*
在VC++6.0中的输出结果为:
————————————
sn=2.561327494111820e+018
Press any key to continue
————————————
*/
5.8 输出所有的水仙花数
/*
时间:2011年10月24日17:00:12
题目:习题5.8 输出所有的水仙花数(3位)
*/
# include <stdio.h>
# include <math.h>
bool IsNarcissus (int number);
int n=3; //这里只求3位数的水仙花数
int main()
{
int i;
for(i=pow(10,n-1); i<pow(10,n); ++i)
{
if (IsNarcissus (i))
{
printf("%d \n",i);
}
}
return 0;
}
bool IsNarcissus (int number)
{
int sum=0;
int x=number;
while(x!=0)
{
sum += pow((x%10),n);
x /= 10;
}
if (sum == number)
{
return true;
}
else
{
return false;
}
}
/*
在VC++6.0中的输出结果为:
————————————
153
370
371
407
Press any key to continue
————————————
*/
时间:2011年10月24日17:00:12
题目:习题5.8 输出所有的水仙花数(3位)
*/
# include <stdio.h>
# include <math.h>
bool IsNarcissus (int number);
int n=3; //这里只求3位数的水仙花数
int main()
{
int i;
for(i=pow(10,n-1); i<pow(10,n); ++i)
{
if (IsNarcissus (i))
{
printf("%d \n",i);
}
}
return 0;
}
bool IsNarcissus (int number)
{
int sum=0;
int x=number;
while(x!=0)
{
sum += pow((x%10),n);
x /= 10;
}
if (sum == number)
{
return true;
}
else
{
return false;
}
}
/*
在VC++6.0中的输出结果为:
————————————
153
370
371
407
Press any key to continue
————————————
*/
5.9 编程序找出1000以内所有完数
/*
时间:2011年10月25日14:43:51
题目:习题5.9 编程序找出1000以内所有完数
备注:要求输出格式为6 its factors are 1,2,3
*/
# include <stdio.h>
bool IsPerfectNumber (int val,int * pArr);
int main()
{
int i,k=0;
int a[100]={0};
for(i=2;i<1000;++i)
{
if(IsPerfectNumber(i,a))
{
printf("%d its factors are 1",i);
for(k=0; k<7; ++k)
{
if(a[k]!=0)
{
printf(",%d",a[k]);
}
}
printf("\n");
}
}
return 0;
}
bool IsPerfectNumber (int val,int * pArr)
{
int i,j,k=0;
int sum = 1;
for(j=2;j<=val;++j)
{
if(j==val || val%j!=0)
{
continue;
}
else
{
sum += j;
*(pArr+k)=j;
++k;
}
}
if (sum == val)
{
return true;
}
else
{
for(i=0; i<=k; ++i)
{
*(pArr+i)=0;
}
return false;
}
}
/*
在VC++6.0中的输出结果为:
————————————
6 its factors are 1,2,3
28 its factors are 1,2,4,7,14
496 its factors are 1,2,4,8,16,31,62,124
Press any key to continue
————————————
*/
时间:2011年10月25日14:43:51
题目:习题5.9 编程序找出1000以内所有完数
备注:要求输出格式为6 its factors are 1,2,3
*/
# include <stdio.h>
bool IsPerfectNumber (int val,int * pArr);
int main()
{
int i,k=0;
int a[100]={0};
for(i=2;i<1000;++i)
{
if(IsPerfectNumber(i,a))
{
printf("%d its factors are 1",i);
for(k=0; k<7; ++k)
{
if(a[k]!=0)
{
printf(",%d",a[k]);
}
}
printf("\n");
}
}
return 0;
}
bool IsPerfectNumber (int val,int * pArr)
{
int i,j,k=0;
int sum = 1;
for(j=2;j<=val;++j)
{
if(j==val || val%j!=0)
{
continue;
}
else
{
sum += j;
*(pArr+k)=j;
++k;
}
}
if (sum == val)
{
return true;
}
else
{
for(i=0; i<=k; ++i)
{
*(pArr+i)=0;
}
return false;
}
}
/*
在VC++6.0中的输出结果为:
————————————
6 its factors are 1,2,3
28 its factors are 1,2,4,7,14
496 its factors are 1,2,4,8,16,31,62,124
Press any key to continue
————————————
*/
5.10 有一个分数数列 2/1,3/2,5/3,8/5,13/8,21/13…求前20项的和
/*
时间:2011年10月25日15:09:21
题目:习题5.10 求分数数列前20项和
备注:分数数列为2/1,3/2,5/3,8/5,13/8...
*/
# include <stdio.h>
int main()
{
int i,n=20;
double a=2,b=1,sum=0;
double t;
for(i=1; i<=n; ++i)
{
sum += a/b;
t = a;
a += b;
b = t;
}
printf("前20项和为%lf\n",sum);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
前20项和为32.660261
Press any key to continue
————————————
*/
时间:2011年10月25日15:09:21
题目:习题5.10 求分数数列前20项和
备注:分数数列为2/1,3/2,5/3,8/5,13/8...
*/
# include <stdio.h>
int main()
{
int i,n=20;
double a=2,b=1,sum=0;
double t;
for(i=1; i<=n; ++i)
{
sum += a/b;
t = a;
a += b;
b = t;
}
printf("前20项和为%lf\n",sum);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
前20项和为32.660261
Press any key to continue
————————————
*/
5.11 有一个球从100米高落下,每次反弹一半,求第10次落地时经过多长距离,第10次反弹多高
/*
时间:2011年10月25日15:30:44
题目:习题5.11 有一个球从100米高落下,每次反弹一半,求第10次落地时经过多长距离,第10次反弹多高
*/
# include <stdio.h>
int main()
{
double sum = 100.0;
double high = sum/2;
int n;
for(n=2; n<=10; ++n)
{
sum += 2*high;
high /= 2;
}
printf("第10次落地时小球经过%lf米,第10次反弹的高度是%lf米\n",sum,high);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
第10次落地时小球经过299.609375米,第10次反弹的高度是0.097656米
Press any key to continue
————————————
*/
时间:2011年10月25日15:30:44
题目:习题5.11 有一个球从100米高落下,每次反弹一半,求第10次落地时经过多长距离,第10次反弹多高
*/
# include <stdio.h>
int main()
{
double sum = 100.0;
double high = sum/2;
int n;
for(n=2; n<=10; ++n)
{
sum += 2*high;
high /= 2;
}
printf("第10次落地时小球经过%lf米,第10次反弹的高度是%lf米\n",sum,high);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
第10次落地时小球经过299.609375米,第10次反弹的高度是0.097656米
Press any key to continue
————————————
*/
5.12猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了
一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天
剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个
桃子。
/*
时间:2011年10月25日15:44:20
题目:习题5.12 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了
一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天
剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。
*/
# include<stdio.h>
int main()
{
int peach=1;
int day;
for(day=9; day>0; --day)
{
peach =2*(peach+1);
}
printf("第1天猴子摘了%d个桃子\n",peach);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
第1天猴子摘了1534个桃子
Press any key to continue
————————————
*/
时间:2011年10月25日15:44:20
题目:习题5.12 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了
一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天
剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。
*/
# include<stdio.h>
int main()
{
int peach=1;
int day;
for(day=9; day>0; --day)
{
peach =2*(peach+1);
}
printf("第1天猴子摘了%d个桃子\n",peach);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
第1天猴子摘了1534个桃子
Press any key to continue
————————————
*/
5.13 用迭代法求平方根
/*
时间:2011年10月25日16:08:06
题目:习题5.13 用迭代法求平方根
公式:Xn+1=(Xn+a/Xn)/2
要求:两次求出的x的差的绝对值小于1e-5
*/
# include <stdio.h>
# include <math.h>
int main()
{
double a;
double x0,x1=1;
printf("输入a的值:");
scanf("%lf",&a);
do
{
x0 = x1;
x1=(x0+a/x0)/2;
}
while(fabs(x1-x0)>=1e-5);
printf("%lf的平方根是%lf\n",a,x1);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入a的值:2
2.000000的平方根是1.414214
Press any key to continue
————————————
*/
时间:2011年10月25日16:08:06
题目:习题5.13 用迭代法求平方根
公式:Xn+1=(Xn+a/Xn)/2
要求:两次求出的x的差的绝对值小于1e-5
*/
# include <stdio.h>
# include <math.h>
int main()
{
double a;
double x0,x1=1;
printf("输入a的值:");
scanf("%lf",&a);
do
{
x0 = x1;
x1=(x0+a/x0)/2;
}
while(fabs(x1-x0)>=1e-5);
printf("%lf的平方根是%lf\n",a,x1);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入a的值:2
2.000000的平方根是1.414214
Press any key to continue
————————————
*/
5.14 用牛顿迭代法求下面方程在1.5附近的根 2X^3-4X^2+3X-6=0
/*
时间:2011年10月26日8:55:22
题目:用牛顿迭代法求下面方程在1.5附近的根 2X^3-4X^2+3X-6=0
*/
# include <stdio.h>
# include <math.h>
int main()
{
double x0,x1=1.5;
double fx,fd;
do
{
x0=x1;
fx=((2*x0-4)*x0+3)*x0-6;
fd=(6*x0-8)*x0+3;
x1=x0-fx/fd;
}
while(fabs(x1-x0)>=1e-5);
printf("方程在1.5附近的根是%lf\n",x1);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
方程在1.5附近的根是2.000000
Press any key to continue
————————————
*/
时间:2011年10月26日8:55:22
题目:用牛顿迭代法求下面方程在1.5附近的根 2X^3-4X^2+3X-6=0
*/
# include <stdio.h>
# include <math.h>
int main()
{
double x0,x1=1.5;
double fx,fd;
do
{
x0=x1;
fx=((2*x0-4)*x0+3)*x0-6;
fd=(6*x0-8)*x0+3;
x1=x0-fx/fd;
}
while(fabs(x1-x0)>=1e-5);
printf("方程在1.5附近的根是%lf\n",x1);
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
方程在1.5附近的根是2.000000
Press any key to continue
————————————
*/
5.15 用二分法求下面方程在(-10,,10)之间的根 2X^3-4X^2+3X-6=0
/*
时间:2011年10月26日9:43:48
题目:习题5.15 用二分法求下面方程在(-10,,10)之间的根 2X^3-4X^2+3X-6=0
*/
# include <stdio.h>
# include <math.h>
int main()
{
double x0=-10,x1=10,x2;
double fx0,fx1,fx2;
fx0=((2*x0-4)*x0+3)*x0-6;
fx1=((2*x1-4)*x1+3)*x1-6;
if(fx0*fx1<0)
{
do
{
x2=(x0+x1)/2;
fx2=((2*x2-4)*x2+3)*x2-6;
if(fx2*fx1<0)
{
x0=x2;
}
else
{
x1=x2;
}
fx0=((2*x0-4)*x0+3)*x0-6;
fx1=((2*x1-4)*x1+3)*x1-6;
}
while(fabs(fx2)>=1e-5);
printf("该范围内的根是%lf\n",x2);
}
else if(fx0*fx1==0)
{
if(fx0==0)
{
printf("该范围有根%lf\n",x0);
}
if(fx1==0)
{
printf("该范围有根%lf\n",x1);
}
}
else
{
printf("该范围内没有根\n");
}
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
该范围内的根是2.000000
Press any key to continue
————————————
*/
时间:2011年10月26日9:43:48
题目:习题5.15 用二分法求下面方程在(-10,,10)之间的根 2X^3-4X^2+3X-6=0
*/
# include <stdio.h>
# include <math.h>
int main()
{
double x0=-10,x1=10,x2;
double fx0,fx1,fx2;
fx0=((2*x0-4)*x0+3)*x0-6;
fx1=((2*x1-4)*x1+3)*x1-6;
if(fx0*fx1<0)
{
do
{
x2=(x0+x1)/2;
fx2=((2*x2-4)*x2+3)*x2-6;
if(fx2*fx1<0)
{
x0=x2;
}
else
{
x1=x2;
}
fx0=((2*x0-4)*x0+3)*x0-6;
fx1=((2*x1-4)*x1+3)*x1-6;
}
while(fabs(fx2)>=1e-5);
printf("该范围内的根是%lf\n",x2);
}
else if(fx0*fx1==0)
{
if(fx0==0)
{
printf("该范围有根%lf\n",x0);
}
if(fx1==0)
{
printf("该范围有根%lf\n",x1);
}
}
else
{
printf("该范围内没有根\n");
}
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
该范围内的根是2.000000
Press any key to continue
————————————
*/
5.16 输出菱形图案
/*
时间:2011年10月26日10:56:44
题目:输出菱形图案
*/
# include <stdio.h>
void draw (int i);
int max=7,n=2;
int main()
{
int i;
for(i=1;i<max;i+=n)
{
draw(i);
}
for(i=max;i>0;i-=n)
{
draw(i);
}
return 0;
}
void draw (int i)
{
int j,k;
for(j=1;j<=(max-i)/2;++j)
{
printf(" ");
}
for(k=1;k<=i;++k)
{
printf("*");
}
printf("\n");
}
/*
在VC++6.0中的输出结果为:
————————————
*
***
*****
*******
*****
***
*
Press any key to continue
————————————
*/
时间:2011年10月26日10:56:44
题目:输出菱形图案
*/
# include <stdio.h>
void draw (int i);
int max=7,n=2;
int main()
{
int i;
for(i=1;i<max;i+=n)
{
draw(i);
}
for(i=max;i>0;i-=n)
{
draw(i);
}
return 0;
}
void draw (int i)
{
int j,k;
for(j=1;j<=(max-i)/2;++j)
{
printf(" ");
}
for(k=1;k<=i;++k)
{
printf("*");
}
printf("\n");
}
/*
在VC++6.0中的输出结果为:
————————————
*
***
*****
*******
*****
***
*
Press any key to continue
————————————
*/
5.17 两个乒乓球队进行比赛,各出3人,甲队为A,B,C 3人.乙队为X.Y,Z 3人;已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X.Z比,请编程序找出 3对赛手的名单。
/*
时间:2011年10月26日11:24:58
题目:习题5.17 两个乒乓球队进行比赛,各出3人,甲队为A,B,C 3人.乙队为X.Y,Z 3人;已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X.Z比,请编程序找出 3对赛手的名单。
*/
# include <stdio.h>
int main()
{
char a,b,c;
for(a='y';a<='z';++a) //a不与x比
{
for(b='x';b<='z';++b)
{
c='y'; //c不与x和z比,则只能跟y比
if(a!=b && b!=c && c!=a) //a,b,c不会与相同的对手比赛
{
printf("a VS %c\n",a);
printf("b VS %c\n",b);
printf("c VS %c\n",c);
}
}
}
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
a VS z
b VS x
c VS y
Press any key to continue
————————————
*/
时间:2011年10月26日11:24:58
题目:习题5.17 两个乒乓球队进行比赛,各出3人,甲队为A,B,C 3人.乙队为X.Y,Z 3人;已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X.Z比,请编程序找出 3对赛手的名单。
*/
# include <stdio.h>
int main()
{
char a,b,c;
for(a='y';a<='z';++a) //a不与x比
{
for(b='x';b<='z';++b)
{
c='y'; //c不与x和z比,则只能跟y比
if(a!=b && b!=c && c!=a) //a,b,c不会与相同的对手比赛
{
printf("a VS %c\n",a);
printf("b VS %c\n",b);
printf("c VS %c\n",c);
}
}
}
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
a VS z
b VS x
c VS y
Press any key to continue
————————————
*/