C程序设计经典题型
1. 水仙花数
#include<stdio.h>
void main()
{int a,b,c,i,n=0;
for(i=100;i<1000;i++)
{a=i/100;b=(i-a*100)/10;c=i-a*100-b*10;
if(i==a*a*a+b*b*b+c*c*c)
{printf("水仙花数为%d",i);
n=n+1;if(n%2==0)printf("/n");
}
}
printf("/n");
}
2. 求两个数的最大公约数和最小公倍数
#include<stdio.h>
void main()
{int a,b,r,t,p;
printf("输入两个数为:");
scanf("%d%d",&a,&b); #include<stdio.h>
if(b>a)
{t=b;b=a;a=t;}
p=a*b;
while(b!=0)
{r=a%b;
a=b;
b=r;
}
printf("最大公约数为%d/n,最小公倍数为%d/n",a,p/a);
}
3. 求1000之内的完数(即它的各因子之和等于它本身,如:6=1+2+3)
#include<stdio.h>
void main()
{int i,n=0,t,j,sum;
printf("完数为:/n");
for(i=1;i<1000;i++)
{sum=0;t=i/2;
for(j=1;j<=(t+1);j++)
{if((i%j)==0)
sum=sum+j;
}
if(sum==i)
{printf(" %d ",i);
n=n+1;
if(n%4==0)printf("/n");
}
}
}
4、 用牛顿迭代法求下面方程在1.5附近的根:
2x3(x的三次方)—4x2+3x—6=0
附:牛顿迭代法
牛顿迭代法又称牛顿切线法,它采用以下的方法求根:先任意设定一个与真实的根接近的X0作为第一次接近的根,由x0求出f(x0),过(x0,f(x0))点做f(x)的切线,交x轴于x1,把它作为第二次近似根,再由x1求出f(x1),再过(x1,f(x1))点做f(x)的切线,交x轴于x2,再求出f(x2),再做切线...........如此继续下去,直到足够接近真正的根x为止。
#include<stdio.h>
#include<math.h>
void main()
{float f1(float);
float f2(float);
float x0=1.5,x1;
x1=x0-f1(x0)/f2(x0);
while(fabs(x1-x0)>=1e-5)
{x0=x1;
x1=x0-f1(x0)/f2(x0);
}
printf("该方程的根为% 3.2f /n",x1);
}
float f1(float x)
{float y;
y=2*x*x*x-4*x*x+3*x-6;
return(y);
}
float f2(float x)
{float y;
y=6*x*x-8*x+3;
return(y);
}
5.1用二分法求解下列方程在-10到10之间的根 :
2x3-4x2+3x-6=0
附:二分法的思路如下
先定一个区间【x1,x2】,如果函数f(x)在此区间是单调变化,可以根据f(x1)和f(x2)是否同号来确定方程f(x)=0在【x1,x2】区间是否有一个实根。若f(x1)和f(x2)不同符号,则方程在此区间必定至少有一个实根;如果不同号,则说明在此区间无实根,要重新改变x1和x2的值。当确定一个区间有实根后,采取二分法将【x1,x2】区间一分为二,再判断在哪一个小区间内有实根,如此往复不断进行下去,直到小区间是足够小为止,此即为二分法。
#include<stdio.h>
#include<math.h>
void main()
{float f(float);
float x0,x1,t,p;
printf("输入一个取值范围:");
do
{scanf("%f%f",&x0,&x1);
}while(f(x0)*f(x1)>0);
if(f(x0)>0)
{p=x0;x0=x1;x1=p;}
do
{t=(x0+x1)/2;
if(f(t)>0)x1=t;
else x0=t;
}while(fabs(f(x0))>1e-6);
printf("该方程的根为x=% 3.2f /n",x0);
}
float f(float x)
{float y;
y=2*x*x*x-4*x*x+3*x-6;
return(y);
}
2用弦截法求方程的根
f(x)=x3-5x2+16x-80=0
方法如下:第一步(同上取两个使方程值异号的x值)
第二步 连接(x1,f(x1))和(x2,f(x2))两点,此线即弦交x轴于x,x点的坐标可用下式表示:
X=(x 1f (x2)-x 2f (x1))/f(x2)-f(x1)
再从x求出f(x).
第三步 若f(x)与f(x1)同号,则根必在(x,x2)区间内,此时将x作为新的x1。如果f(x)与f(x2)同号,则表示根在(x1,x)之间,将x作为新的x2.
第四步 重复步骤2和3,直到|f(x)|足够小为止,此时可认为f(x)≈0.
为什么输入2和7及以上值时有问题
#include<stdio.h>
#include<math.h>
float f(float x)
{float y;
y=x*x*x-5*x*x+16*x-80;
return(y);
}
float xpoint(float x1,float x2)
{float x;
x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return(x);
}
float root(float x1,float x2)
{float x,y,y1;
y1=f(x1);
do
{x=xpoint(x1,x2);
y=f(x);
if(y*y1>0)
{y1=y;x1=x;}
else x2=x;
}while(fabs(y)>=1e-6);
return(x);
}
void main()
{float x1,x2,f1,f2,x;
do
{printf("input x1,x2:/n");
scanf("%f,%f",&x1,&x2);
f1=f(x1);
f2=f(x2);
}while(f1*f2>=0);
x=root(x1,x2);
printf("A root of equation is % 8.4f /n",x);
}
6.用循环语句输出竖形菱形星形,如:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
#include<stdio.h>
void main()
{int n,i,t,a,b,p;
printf("请输入有几行奇数行星:");
scanf("%d",&n);
t=n/2;
for(i=1;i<=t;i++)
{for(a=1;a<=t+1-i;a++)
printf(" ");
for(b=1;b<=2*i-1;b++)
printf("*");
printf("/n");
}
for(p=1;p<=n;p++)
printf("*");
printf("/n");
for(i=1;i<=t;i++)
{for(a=1;a<=i;a++)
printf(" ");
for(b=1;b<=2*(t+1-i)-1;b++)
printf("*");
printf("/n");
}
printf("/n");
}
7.1冒泡法十数排序:(从小到大)不知道为什么浮点型错
思路如下:将相邻两个数比较,将小的数排到前面。
#include<stdio.h>
void main()
{int a[10],i,j,t;
printf("请输入十个数为:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
{for(j=i+1;j<10;j++)
if(a[j]<a[i])
{t=a[j];a[j]=a[i];a[i]=t;}
}
printf("排出的数为:/n");
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("/n");
}
2用选择法对十个数排序(从小到大)
思路如下:将第一个数a[0]与后面9个数比较,若都比后9个数小,则a[0]不变,若后面有比a[0]小的,则将a[0]与后面中最小一个交换,此时a[0]中存放了十个数中最小的一个数;接着同上比较,a[1]中存放第二小的数.........共进行9轮比较,即已经完成了从小到大的排序。
#include<stdio.h>
void main()
{int a[10],i,j,t,r;
printf("请输入十个数为:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
{r=i;
for(j=i+1;j<10;j++)
if(a[r]>a[j])r=j;
t=a[i];
a[i]=a[r];
a[r]=t;
}
printf("最后排序数为:/n");
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("/n");
}
8.已有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插人数组中。
不知道为什么浮点型错
#include<stdio.h>
void main()
{int a[5]={2,4,7,12,15},i,x,j,t,b[6];
scanf("%d",&x);
if(x<a[0])
{t=x;
b[0]=t;
for(i=0;i<5;i++)
b[i+1]=a[i];
}
else if(x>a[4])
{t=x;
b[5]=t;
for(i=0;i<5;i++)
b[i]=a[i];
}
else if(x>a[0]&&x<a[4])
{for(i=0;i<5;i++)
if(x>a[i]&&x<a[i+1])
j=i;
for(i=0;i<=j;i++)
b[i]=a[i];
b[j+1]=x;
for(i=j+2;i<6;i++)
b[i]=a[i-1];
}
printf("重新排列的数组为:");
for(i=0;i<6;i++)
printf("%4d",b[i]);
printf("/n");
}
9.杨辉三角的输出。
#include<stdio.h>
#define N 10
void main()
{int a[N][N],i,j;
for(i=0;i<N;i++)
a[i][0]=1;
for(i=1;i<N;i++)
a[i][i]=1;
for(i=2;i<N;i++)
for(j=1;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<N;i++)
{for(j=0;j<i+1;j++)
printf("%-5d",a[i][j]);
printf("/n");
}
printf("/n");
}
*10.魔方阵的输出(魔方阵即它的每一行、每一列和对角线之和均相等。例如三阶魔方阵为
8 1 6
3 5 7
4 9 2
魔方阵的排列规律如下:
1).将1放在第一行中间一列;
2).从2开始直到NXN止依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1(例如上面的方阵,5在4的上一行后一列)。
3).如果上一数的行数为1,则下一个数的行数为n(指最下一行),例如1在第一行,2则在最下一行。
4).当上一个数的列数为n时,下一个数的列数为1,行数减1,例如,2在第三行最后一列,3则应放在他第二行第一列。
5).如果按上面规则确定的位置上已有数,或上一个数是第1行n列时,则把下一个数放在上一个数的下面。例如,按上面的规则,4应放在第一行第二列。但该位置已被1占据,所以4就放在3的下面。重编
按此方法可以得到任何阶的魔方阵。
#include<stdio.h>
void main()
{int a[16][16],j,i,k,p,n;
p=1;
while(p==1) /*要求阶数在1到15之间的奇数*/
{printf("请输入n值:");
scanf("%d",&n);
if((n!=0)&&(n<=15)&&(n%2!=0))
p=0;
}
for(i=1;i<=n;i++) /*确定魔方阵大小*/
for(j=1;j<=n;j++)
a[i][j]=0;
j=n/2+1;a[1][j]=1; /*第一步:将1放到第一行中间一列*/
for(k=2;k<=n*n;k++)
{i=i-1;j=j+1;
if((i<1)&&(j>n)) /*如果上一行数是第一行第n列时,则*/
{i=i+2;j=j-1;} /* 下一个数放在上一个数的下面*/
else
{if(i<1)i=n;
if(j>n)j=1;
}
if(a[i][j]==0)
a[i][j]=k;
else /*如果按上面的规则确定的位置上已有数*/
{i=i+2;j=j-1;a[i][j]=k;} /*下一个数放在上一个数的下面*/
}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf("%5d",a[i][j]);
printf("/n");
}
printf("/n");
}
*11.有15个数按由大到小的顺序排列存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元数的值,如果该数不在数组中,则输出“无此数”。?
重编
#include<stdio.h>
#include<math.h>
#define M 15
void main()
{int a[M],i,j,top,bot,x,flag=1,mid,k=0;
char ch='Y',p;
printf("请由大到小输入相应的元素:/n");
for(i=0;i<M;i++)
scanf("%d",&a[i]);
while(ch=='Y')
{top=M-1;bot=0;
printf("请输入要查找的元素的值:");
scanf("%d",&x);
while(k<=sqrt(M))
{mid=(top+bot)/2;
if(x==a[mid]){j=mid;flag=0;}
else if(x>a[mid])top=mid-1;
else if(x<a[mid])bot=mid+1;
if(flag==0)break;
else k=k+1;
}
if(flag==0)break;
else if(flag)
{printf("没有要查找的数,是否继续查找:Y/N ? /n");
scanf("%c",&p);
}
if(p=='Y')k=0;
else if(p=='N'){printf("结束,没有要查找的数./n");ch='N';}
}
if(flag==0)printf("你查找的数的位置为第%d位./n",(j+1));
}
12.写一个函数,输入一行字符(每个单词间用空格符隔开),将此字符串中最长的单词输出。(重编)
#include<stdio.h>
#include<string.h>
void main()
{int alphabetic(char);
int longest(char[]);
int i;
char line[100];
printf("input one line:/n");
gets(line);
printf("The lingest word is: ");
for(i=longest(line);alphabetic(line[i]);i++)
printf("%c",line[i]);
printf("/n");
}
int alphabetic(char c)
{if(c>='a'&&c<='z'||c>='A'&&c<='Z')
return(1);
else return(0);
}
int longest(char string[])
{int len=0,i,length=0,flag=1,place=0,point;
for(i=0;i<=strlen(string);i++)
if(alphabetic(string[i]))
if(flag){point=i;flag=0;}
else len++;
else {flag=1;
if(len>=length)
{length=len;
place=point;len=0;}
}
return(place);
}
13.输入10个学生5门课的成绩,分别用函数实现下列功能:(该程序可优化,如若有最高分相同的情况时,每个学生姓名不同长时,将相应的数组长度及输出间隔做相应的调整等等,考虑优化后的程序可能更为复杂,此暂不设计,读者课照此优化)
1计算每个学生平均分;
2计算每门课的平均分;
3找出所有50个分数中最高的分数所对应的学生和课程;
4计算平均方差:
方差=(∑(xi)2)/n-((∑xi)/n)2
#include<stdio.h>
#define N 10
#define M 5
int l,k;
void main()
{void average1(int b[][M],float ave[]);
void average2(int b[][M],float ave[]);
void max(int b[][M]);
float fangcha(float b[],int);
float ave1[N]={0},ave2[M]={0};
int i,j,a[N][M];
char m[N+1][10];
for(i=0;i<N;i++)
{printf("请输入姓名: ");
scanf("%s",m[i]);
printf("/n");
printf("请输入成绩:");
for(j=0;j<M;j++)
scanf("%d",&a[i][j]);
printf("/n");
}
scanf("%s",m[N]);
printf("/n");
average1(a,ave1);
average2(a,ave2);
printf("姓名科目 数学 英语 语文 物理 化学 平均分/n");
for(i=0;i<N;i++)
{printf("%s",m[i]);
for(j=0;j<M;j++)
printf("%6d",a[i][j]);
printf("% 7.1f ",ave1[i]);
printf("/n");
}
printf("%s",m[N]);
for(i=0;i<M;i++)
printf("% 6.0f ",ave2[i]);
printf("/n");
printf("该最高分学生的课程为:");
max(a);
printf("/n");
printf("该学生姓名是:%s/n",m[l]);
printf("学生方差为:%f/n",fangcha(ave1,N));
printf("科目方差为:%f/n",fangcha(ave2,M));
}
void average1(int b[N][M],float ave[N])
{int i,j;
float z,sum;
for(i=0;i<N;i++)
{sum=0;
for(j=0;j<M;j++)
sum=sum+b[i][j];
z=sum/M;
ave[i]=z;
}
}
void average2(int b[N][M],float ave[M])
{int i,j;
float z,sum;
for(i=0;i<M;i++)
{sum=0;
for(j=0;j<N;j++)
sum=b[j][i]+sum;
z=sum/N;
ave[i]=z;
}
}
void max(int b[N][M])
{int i,j,zui;
zui=0;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(b[i][j]>zui)
{zui=b[i][j];l=i;k=j;}
if(k==0)
printf("数学");
else if(k==1)
printf("英语");
else if(k==2)
printf("语文");
else if(k==3)
printf("物理");
else if(k==4)
printf("化学");
}
float fangcha(float b[],int n)
{float t,r,p,z,sum1=0,sum2=0;
int i;
for(i=0;i<n;i++)
sum1=b[i]*b[i]+sum1;
t=sum1/n;
for(i=0;i<n;i++)
sum2=sum2+b[i];
r=sum2/n;
p=r*r;
z=t-p;
return(z);
}
注:此文为本人在学习c时的一些练习题,初涉论坛,还有些生疏,望各位朋友多提意见,以望共同进步,不胜感激 !