第一题:求[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)
ifn>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的一组正整数(A,B,C),
例如,(3,4,5)是勾股弦数,因为:3^2+4^2=5^2。
求A,B均小于25且A+B+C<=100的勾股弦数的个数。11
#include
#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的一组正整数(A,B,C),
例如,(3,4,5)是勾股弦数,因为:3^2+4^2=5^2。求A,B,C均小于或等于100的勾股弦数中A+B+C的最大值。
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为正整数,求满足个条件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]
index=i;
if(index!=k)
{
temp=a[index];
a[index]=a[k];
a[k]=temp;
}
}
printf("The
sorted array is:\n");
for
(i=0;i
printf("]",a[i]);
printf("\n");
return
0;
}
(3)编程,输入n(3个数,输出这n个数中的最小值及其下标。
#include
int main()
{
int
a[10],i,n,x=0,k,j=1;
do
{
printf("请输入n(3
scanf("%d",&n);
}while
(n<=3||n>10);
printf("Please
input %d elements:\n",n);
for(i=0;i
scanf("%d",&a[i]);
printf("\n");
for(i=0;j
{
while
(j
{
if(a[i]>a[j])
break;
j++;
}
}
k=i-1;
printf("最小值为%d\n",a[i-1]);
printf("最小值下标为%d\n",k);
return
0;
}
练习题
1:编写程序。从键盘上输入20个整数,求去掉最大值和最小值以后那些元素的平均值。
#include
int main()
{
int
a[20],max,min,i,sum=0,count=0;
double
n;
printf("请输入20个整数:\n");
for(i=0;i<20;i++)
{
scanf("%d",&a[i]);
max=min=a[0];
}
for (i=0;i<20;i++)
{
if(*(a)>max)max=*(a);
else
if(*(a)
}
for
(i=0;i<20;i++)
if(a[i]!=max&&a[i]!=min)
{
sum+=a[i];
count++;
}
n=sum/count;
printf("count=%d,n=%lf\n",count,n);
return
0;
}
2.编写程序。首先计算Fibonacci数列1,1,2,3,5,8,13,21,……的前N项(n不超过40)存入一堆数组中,再按每行8项的格式输出。
#include
int main()
{
int a[40],i;
a[0]=1;
a[1]=1;
for(i=1;i<=40;i++)
a[i+1]=a[i]+a[i-1];
for(i=0;i<=40;i++)
{
printf("d",a[i]);
if((i+1)%8==0)
printf("\n");
}
printf("\n");
return 0;
}
3.输入学生人数(不超过30)后输入每个学生的成绩,统计每个分数段学生人数个数,并求最高分、最低分和平均值。
#include
void main()
{
int
i,n,count[5];
double
sum,min,max,point[31];
printf("请输入学生人数:");
scanf("%d",&n);
for(i=0;i<5;i++)
count[i]=0;
printf("请输入每个学生的分数:\n");
for(i=0;i
scanf("%lf",&point[i]);
max=point[0];min=point[0];sum=0.0;
for(i=0;i
{
if(max
max=point[i];
if(min>point[i])
min=point[i];
if(0.0<=59.0)
count[0]++;
elseif(60.0<=69.0)
count[1]++;
elseif(70.0<=79.0)
count[2]++;
elseif(80.0<=89.0)
count[3]++;
if(89.0<=100.0)
count[4]++;
sum+=point[i];
}
printf("最高分为:%lf\n",max);
printf("最高低为:%lf\n",min);
printf("平均分为:%lf\n",sum/n*1.0);
printf("0分到59分:
%d\n",count[0]);
printf("60分到69分:
%d\n",count[1]);
printf("70分到79分:
%d\n",count[2]);
printf("80分到89分:
%d\n",count[3]);
printf("90分到100分:
%d\n",count[4]);
}