C语言练习题
第一题:求[666,777]范围内素数的个数。16#include
#include
void main()
{ int i,n=0,j;
for (i=666;i<=777;i++)
{ for
(j=2;j<=sqrt(i);j++)
if (i%j==0) break;
if (j>sqrt(i)) {n++; printf("]",i);}
}
printf("\n]",n);
}
第二题:求方程X^3-2X-5=0在区间[1.5,2.5]上的一个实根。要求:按四舍五入的方式精确到小数点后第二位。
2.09#include
#include
void main()
{
float x,x0=2.0,f,f0;
do
{
x=x0;
f=x*x*x-2*x-5;
f0=3*x*x-2;
x0=x-f/f0;
} while(fabs(x-x0)>=1e-6);
printf("%.2f",x);
}
第三题:求1/2+2/3+3/5+5/8+……的前1000项的和(注:该数列从第二项开始,其分子等于前一项的分母,而其分母等于前一项分子与分母之和)。要求:按四舍五入的方式精确到小数点后第二位。617.95
#include
#include
void
main()
{
int
i;
double n=1,m=2,d,sum=0;
for(i=1;i<=1000;i++)
{
sum+=n/m;
d=m;
m+=n;
n=d;
}
printf("1/2+2/3+3/5+5/8+……的前1000项的和为%.2lf\n",sum);
}
第四题:一个数如果刚好与它所有的因子之和相等,则称该数为一个“完数”,如:6=1+2+3,则6就是一个完数。求出200到500之间所有的完数之和。
496
#include
void
main()
{
int a,b,c=0,s=0;
for(a=200;a<500;a++)
{
s=0;
for(b=1;b
{
if(a%b==0)
s+=b;
}
if(s==a)
c+=a;
}
printf("%d\n",c);
}
第五题:求Y=1-1/2+1/3-1/4+...-1/2*n
前30项之和。要求:按四舍五入的方式精确到小数点后第二位。0.68
#include
#include
void
main()
{
int i;
float n=1,m=1,sum=0;
for(i=2;i<=29;i++)
{
sum+=n;
m=-m;
n=m/i;
}
printf("Y=1-1/2+1/3-1/4+...-1/2*n……前30项之和为%.2lf\n",sum);
}
第六题:已知24有8个正整数因子(即:1,2,3,4,6,8,12,24),而24正好被其因子个数8整除。求[1,100]之间第10个能被其因子数目整除的正整数。
56
#include
void main()
{
int i,n,j,k=0;
clrscr();
for (i=1;i<=100;i++)
{
n=0;
for (j=1;j<=i;j++)
if (i%j==0)
n++;
if (i%n==0)
{
k++;
printf("]",i);
}
if (k==10)
{
printf("\n]",i); break;
}
}
}
第七题:倒勾股数是满足公式: 1/A^2+1/B^2=1/C^2
的一组正整数(A,B,C),例如,(156,65,60)是倒勾股数,因为:1/156^2+1/65^2=1/60^2。假定A>B>C,求A,B,C均小于或等于100的倒勾股数有多少组?
5
#include
#include
void main()
{ int i,n=0,j,k;
for (i=1;i<=100;i++)
for
(j=i;j<=100;j++)
for (k=j;k<=100;k++)
if
(fabs(1.0/(k*k)+1.0/(j*j)-1.0/(i*i))<1e-10)
{ n++;printf("%d,%d,%d\n",i,j,k); }
printf("%d\n",n);
}
第八题:已知Fibonacci数列:1,1,2,3,5,8,……,它可由下面公式表述:F(1)=1 if n=1 F(2)=1 if n=2 F(n)=F(n-1)+F(n-2)
if
n>2
试求F(1)+F(2)+……+F(50)值。提示:
最好使用递推法求解,因为使用递归调用很可能超出某些语言的递归深度。 32951280098#include
main()
{ int i;
double f[50]={1,1},s=0;
for(i=2;i<50;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<50;i++)
{ if(i%2==0)
printf("\n");
s=s+f[i];
printf(".0f",f[i]);
}
printf("\n.0f",s);
}
第九题:有一个分数序列:2/1,3/2,5/3,8/5,13/8,21/13....(注:该数列从第二项开始,其分子是前一项的分子与分母的和,而其分母是前一项的分子),求出这个序列前24项的和。要求:按四舍五入的方式精确到小数点后第二位。
39.13
#include
main()
{ float
s1=2,s2=1,s,t=0,i;
t=t+s1/s2;
for
(i=1;i<=23;i++)
{ s=s1;
s1=s1+s2;
s2=s;
t=t+s1/s2;
}
printf("%.2f",t);
}
第十题:已知24有8个正整数因子(即:1,2,3,4,6,8,12,24),而24正好被其因子个数8整除。问[100,300]之间有多少个能被其因子数目整除的数。
19#include
void main()
{ int i,n,j,k=0;
clrscr();
for (i=100;i<=300;i++)
{ n=0;
for (j=1;j<=i;j++)
if (i%j==0) n++;
if (i%n==0)
{ k++; printf("]",i);}
}printf("\n]",k);
}第十一题:自然数对是指两个自然数的和与差都是平方数,如8和17的和8+17=25与其差17-8=9都是平方数,则称8和17是自然数对(8,17)。假定(A,B)与(B,A)是同一个自然数对且假定A>=B,求所有小于或等于100(即:A<=100,B<=100)的自然数对中B之和。
1160#include "stdio.h"
#include "math.h"
void main()
{ int a,b,n=0;float s1,s2;
for(b=1;b<=100;b++)
for
(a=b+1;a<=100;a++)
{ s1=sqrt(a+b);s2=sqrt(a-b);
if ( s1==(int)s1 && s2==(int)s2
)
{ n=n+b;printf("%d,%d\t\t",a,b);} }
printf("\n%d",n);
}
第十二题:水仙花数是一个三位正整数,它等于它的各位数字的立方之和.例如:153=1^3+5^3+3^3,所以153是水仙花数. 试求有多少个水仙花数? 4
#include "stdio.h"
void main()
{ int i,a,b,c,n=0;
for(i=100;i<=999;i++)
{ a=i/100;
b=(i/10);
c=i;
if (i==a*a*a+b*b*b+c*c*c)
{ n++;printf("]",i);}
}
printf("\n%d",n);
}第十三题:勾股弦数是满足公式:A^2+B^2=C^2 (假定A
#include
void main()
{ int i,n=0,j,k;
for (i=1;i<=25;i++)
for
(j=i;j<=25;j++)
for (k=j;k<=100;k++)
if (i*i+j*j==k*k &&
i+j+k<100)
{ n++;printf("%d,%d,%d\n",i,j,k); }
printf("%d\n",n);
}第十四题:设有6个十进制数字a,b,c,d,f,e,求满足abcdf×e=fdcba条件的五位数abcdf(a≠0,e≠0,e≠1)的个数。
2
#include
void main()
{ long int a,b,c,d,e,f,n=0;
for
(e=2;e<=9;e++)
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
for(d=0;d<=9;d++)
for(f=0;f<=9;f++)
if
((a*10000+b*1000+c*100+d*10+f)*e==f*10000+d*1000+c*100+b*10+a)
{printf("%ld,%ld,%ld,%ld,%ld,%ld\n",a,b,c,d,f,e); n++; }
printf("\n%ld",n);
}
第十五题:勾股弦数是满足公式: A^2+B^2=C^2
(假定A
240
#include
#include
void main()
{ int i,j,k,i1=0,j1=0,k1=0;
for (i=1;i<=100;i++)
for
(j=i;j<=100;j++)
for (k=j;k<=100;k++)
if (i*i+j*j==k*k )
{ printf("%d,%d,%d,%d\n",i,j,k,i+j+k);
if (i+j+k>i1+j1+k1)
{i1=i;j1=j;k1=k;}
}
printf("\n%d\n",i1+j1+k1);
}第十六题:设某四位数的各位数字的平方和等于100,问共有多少个这种四位数?
49#include
#include
void main()
{ int i,n=0,a,b,c,d;
for (i=1000;i<=9999;i++)
{
a=i/1000;
b=(i00)/100;
c=((i00)/10);
d=i;
if (a*a+b*b+c*c+d*d==100 )
{ n++;printf("%d,%d,%d,%d\t\t",a,b,c,d);
}
}
printf("\n%d",n);
}
第十七题:所谓“同构数”是指这样一个数,它出现在它的平方数的右侧,例如5的平方是25,25的平方是625,故5和25都是同构数,求[1,1000]之间所有同构数的个数和总和。7,1114
#include
int
main()
{
int
i,sum=0,c=0;
for(i=1;i<=1000;i++)
{
if((i*i)==i||(i*i)0==i||(i*i)00==i)
{
c+=1;
sum+=i;
}
}
printf("count=%d,sum=%d\n",c,sum);
return 0;
}
第十八题:已知A
求满足个条件A×B=716699且A+B最小的A值。
#include
#include
#include
void
main()
{
int
a,b,min=716700,mina=1;
int
k=sqrt(716699);
for(a=1;a
{
for(b=a+1;b<=716699;b++)
{
if(a*b==716699)
{
if(a+b
{
min=a+b;
mina=a;
}
}
}
}
printf("mina is %d , mim(a+b)is %d\n",mina,min);
}
或
#include
"stdio.h"
#include
"math.h"
void
main()
{ long int
a,b,i,j;
i=716699;
j=716699;
for(a=3;a
for(b=a;b<2*sqrt(716699);b+=2)
if(a*b==716699)
{
if((a+b)
{i=a;j=b;}
}
printf("a=%ld,b=",i,j);
}
第十九题:猴子第一天摘下若干桃子,当即吃了一半,还不过瘾又多吃了一个。第二天早上又将剩下的桃子吃了一半,还是不过瘾,有多吃一个。以后每天都吃前一天剩下的一半再加一个。到第10天再吃剩下一个了。求猴子第一天摘了多少桃子?1534
#include
int
main()
{
int
i,sum=1;
for(i=1;i<=9;i++)
sum=(sum+1)*2;
printf("第一天摘了%d个桃子\n",sum);
return 0;
}
第二十题:编写程序,求所有符合算式ij*ji=1300的最小数ij(即i*10+j)。其中i、j是1~9之间的一位整数。25
#include
int
main()
{
int
i,j,m,n;
m=9;
n=9;
for(i=1;i<=9;i++)
{
for(j=i+1;j<=9;j++)
{
if((i*10+j)*(j*10+i)==1300)
{
printf("i=%d,j=%d\t",i,j);
if((i+j)
{ m=i; n=j;}
}
}
}
printf("\nmin=%d%d\n",m,n);
return 0;
}
第二十一题:设某国今年的国民生产总值为45600亿元,若今后每年以8%的增长率增长,计算多少年后能实现国民生产总值翻两番? 19
#include
#include
int
main()
{
double i,b;
int
count=0;
b=45600*2*2;
for(i=45600;i<=b;)
{
i=i*(1+0.08);
count+=1;
}
printf("%d\n",count);
return 0;
}
第二十二题:求满足条件abcd*e=dcba的最小的四位数abcd,其中a,b,c,d,e均为0到9的数字,但a非0,e非0非1。1089
#include
int
main()
{
int
a,b,c,d,e,min,i;
for
(a=9;a>0;a--)
{
for (b=9;b>=0;b--)
{
for (c=9;c>=0;c--)
{
for (d=9;d>=0;d--)
{
for (e=2;e<10;e++)
{
if ((a*1000+b*100+c*10+d)*e == d*1000+c*100+b*10+a)
{
i=a*1000+b*100+c*10+d;
min=i;
}
}
}
}
}
}
printf("min=%d\n",i);
return 0;
}
第二十七题:自然数对是指两个自然数的和与差都是平方数,如8和17的和8+17=25与其差17-8=9都是平方数,则称8和17是自然数对(8,17)。假定(A,B)与(B,A)是同一个自然数对且假定A>=B,求所有小于或等于100(即:A<=100,B<=100)的自然数对中A之和。
1669
#include
#include
void
main()
{ int
a,b,n=0;
float
s1,s2;
for(b=1;b<=100;b++)
{
for
(a=b+1;a<=100;a++)
{
s1=sqrt(a+b);s2=sqrt(a-b);
if ( s1==(int)s1 && s2==(int)s2
)
{
n=n+a;
printf("%d,%d\t\t",a,b);
}
}
}
printf("\nsum a is
%d\n",n);
}
第二十八题:求方程8x-5y=3,在|x|<=150,
|y|<=200内的整数解。试问这样的整数解中|x|+|y|的最大值是多少?323 (我估计参考答案错误)
#include
int
main()
{
int
x,y,a,b,m=1,n=1;
for(x=-150;x<=150;x++)
{
a=x;
if(x<0)
{ a=-x;}
for(y=-200;y<=200;y++)
{
b=y;
if(y<0)
{ b=-y;}
if(8*a-5*b==3)
{
printf("x=%d,y=%d\t",x,y);
if((a+b)>(m+n))
{ m=a;n=b;}
}
}
}
printf("\n|x|+|y|的最大值为%d\n",n+m);
return 0;
}
第二十九题:把一张一元钞票,换成一分、二分和五分硬币,每种至少11枚,问有多少种方案? 13
#include
int
main()
{
int
a,b,c,x,y,z,count=0;
for(a=11;a<=100;a++)
{
for(b=22;b<=100;b+=2)
{
for(c=55;c<=100;c+=5)
{ if(a+b+c==100)
{
x=a/1;
y=b/2;
z=c/3;
printf("1分=%d,2分=%d;5分=%d\t\t\t",x,y,z);
count++;
}
}
}
}
printf("\n有%d种方案\n",count);
return 0;
}
数组题:
⑴求1/2+2/3+3/5+5/8+……的前1000项的和(注:该数列从第二项开始,其分子等于前一项的分母,而其分母等于前一项分子与分母之和)。要求:按四舍五入的方式精确到小数点后第二位。617.95
#include
void
main()
{
int i;
double a[1001],sum;
a[0]=1;
a[1]=2;
sum=a[0]/a[1];
for(i=2;i<=1000;i++)
{
a[i]=a[i-1]+a[i-2];
sum+=a[i-1]/a[i];
}
printf("%.2lf",sum);
}
(2) 已知一个数列的前三项为0,0,1,以后各项都是其相邻的前三项之和,求该数列前30项之和。
#include
void
main()
{
int i;
int a[30],sum;
a[0]=a[1]=0;
a[2]=1;
sum=a[0]+a[1]+a[2];
for(i=3;i<=29;i++)
{
a[i]=a[i-1]+a[i-2]+a[i-3];
sum+=a[i];
}
printf("%d\n",sum);
}
(3) 求Y=1-1/2+1/3-1/4+...-1/2*n
前30项之和。要求:精确到小数点后第二位。0.68
#include
int
main()
{
int i;
double
a[30],t=1,sum;
a[0]=1;
sum=a[0];
for(i=1;i<=29;i++)
{
t=-t;
a[i]=a[i-1]+1;
sum+=t/a[i];
}
printf("%.2lf\n",sum);
}
(4)已知Fibonacci数列:1,1,2,3,5,8,……,它可由下面公式表述:
F(1)=1
if
n=1 F(2)=1
if
n=2 F(n)=F(n-1)+F(n-2)
if
n>2
试求F(1)+F(2)+……+F(50)值。
32951280098
#include
int
main()
{
int i;
double a[50],sum;
a[0]=a[1]=1;
sum=a[0]+a[1];
for(i=2;i<=49;i++)
{
a[i]=a[i-1]+a[i-2];
sum+=a[i];
}
printf("%.lf\n",sum);
return 0;
}
编程训练
(1)编程求菲波那挈数列1,1,2,3,5,8,13,21,......的前n项,n由用户输入要求使用数组。(n值小于30)
#include
int
main()
{
int a[30],i,n,sum;
do
{
printf("Please input
n(1<=n<=30):\n");
scanf("%d",&n);
}while (n<1||n>=30);
a[0]=1;
a[1]=1;
sum=a[0]+a[1];
for(i=2;i
{
a[i]=a[i-1]+a[i-2];
sum+=a[i];
}
printf("菲波那挈数列的前%d项之和为%d\n",n,sum);
}
(2)输入一数组,按从大到小的顺序排列(提示:可用选择排序、冒泡排序或插入排序的任意一种)。
#include
int
main()
{
int a[30],n,index,i,k,temp;
do
{
printf("Please input
n(1<=n<=30:\n");
scanf("%d",&n);
}while (n<1||n>30);
printf("Please input %d elements:\n",n);
for (i=0;i
scanf("%d",&a[i]);
printf("The original array is:\n");
for (i=0;i
printf("]",a[i]);
printf("\n");
for (k=0;k
{
index=k;
for (i=k+1;i
if(a[i]