一、 累加累乘
基本知识:
S=S+X 累加 0
X=X+1 计数 0
T=T*X 累乘 求Xn 1
T=T*I 累乘 求N! 1
应用:级数求和
1.输入x、n后输出下列算式的值。(次数控制)
[程序1]
#include
void main( )
{ float s, t, x,t1=1.0,t2=1.0; int i, n;
scanf("%f%d", &x, &n);
s=0, t=-1;
for(i=1; i<=n; i++) {
t1=t1*x;
t2=t2*i;
t=-t; s=s+t*t1/t2;}
printf (“%f”,s);
}
[程序2]
#include
float f1(float x , int n) //xn
{ float y=1.0; int k;
for(k=1;k<=n;k++)
y=y*x;
return y;
}
long f2(int n) //n!
{ long m=1; int k;
for(k=1;k<=n;k++)
m=m*k;
return m;
}
//递归实现
double f3(float x,int n)
{
if(n==0) return 1;
else
return x*f3(x,n-1);
}
double f4(int n) //n!
{
if(n==0 || n==1) return 1;
else
returm n*f4(n-1);
}
double f5(int n) //斐波那契数列第n项
{
if(n==1 || n==2) return 1;
else return f5(n-1)+f5(n-2);
}
double sum(int n) //求1+2+…+n
{
if(n==1) return 1;
else return n+sum(n-1);
}
void main( )
{ float s, t, x; int i, n;
scanf("%f%d", &x, &n);
s=0, t=-1;
for(i=1; i<=n; i++)
{ t=-t; s=s+t*f1(x,i)/f2(i);}
printf (“%f”,s);
}
二、 整除性
基本知识:
x%y==0
(int)(x/y)==x/y
fmod(x,y)==0
应用:
1.素数(质数)
#include
#include
void main()
{
int m,i,n=0;
do {
scanf(“%d”,&m);
n=sqrt(m); //n=m/2;
for(i=2;i<=n;i++)
if(m%i==0) break;
if(i>n)
printf(“ %d”,m);}
while(m!=0);/*输入0结束*/
}
[素数2]
#include
#include
int prime(int m)
{ int k;
if(m==1) return 0;
for(k=2;k<= m/2;k++)
if(m%k==0) return 0;
return 1;
}
void main()
{
int m,i,n=0;
do {
scanf(“%d”,&m);
if(prime(m))
printf(“ %d是素数.”,m);
else
printf(“%d不是素数.”,m);
}
2.水仙花数:若某数等于各位数字的立方和,则称该数为水仙花数
for(i=100;i<=999;i++)
{a=i%10; //个位
b=i/10%10; //十位
c=i/100; //百位
if(a*a*a+b*b*b+c*c*c==i)
printf(“%d”,&i);
}
输入一个整数判断是否是水仙花数.
scanf(“%d”,&m);t=0; n=m;
while(n>0)
{ k=n%10; t=t+k*k*k; n=n/10;}
if(m==t) printf(“%d是水仙花数.”,m);
[水仙花数]
#include
int f(int m)
{ int k,n,t;
n=m; t=0;
while(n!=0)
{ k=n%10; t=t+k*k*k; n=n/10;}
if(m==t) return 1;
else return 0;
}
void main()
{
int m;
do
{ scanf(“%d”,&m);
if(f(m)) printf(“%d是水仙花数.”,m);
else printf(“%d不是水仙花数.”,m);
}while(m!=0);
}
3.完数:某数等于其诸因子之和则该数为完数,如6=1+2+3,28=1+2+4+7+14 则6、28就是完数。
#include
#include
void main()
{ int n,i,s;
for(n=6;n<=1000;n++)
{ s=0;
for(i=1;i<=n/2;i++)
if(n%i==0) s+=i;
if(n==s) fprintf(p,"%6d",n);
}
4.数位截取:输入一个长整型数,求各位数字的平方和
#include
void main()
{int digit;
long in,s;
scanf(“%ld”,in);
if(in<0) in=-in;
s=0;
while(in>0)
{ digit=in%10;
s=s+digit*digit
in=in/10;
}
printf(“sum=%ld\n”,s);
}
5.最大公约数、最小公倍数
#include
void main()
{ int m,n,k,t,p;
scanf("%d%d",&m,&n);
if(m>n) {k=m; p=n;}
else {k=n;p=m;}
while((t=(k%p))!=0)
{
k=p;
p=t;
}
printf("gong yue shu= %d\n",p);
printf("gong bei shu= %d\n",m*n/p);
}
6.亲密数对:说明:若a、b为1对亲密数,则a的因子和等于b、b的因子和等于a、且a不等于b。如:220、284是1对亲密数,284、220也是1对亲密数。
#include
void main()
{
int a,b,c,i;
for(a=6;a<=5000;a++)
{
b=0;
if(a%i==0)
b=b+i;
c=0;
for(i=1;i
if(b%i==0)
c=c+i;
if(a==c && a!=b)
printf("%6d,%6d\n",a,b);
}
}
三、 最大最小
1. 从输入的若干个正数中选出最小数
#include
void main()
{
float x,min;
scanf("%f",&x);
min=x;
while(x>=0){
if(x
min=x;
scanf("%f",&x);
}
printf("the minium number is %f",min);
}
2.编制函数,其功能是在float类型1维数组中查找最大值、最小值,并将它们返回到调用程序。
#include
void max_min(int x[ ], int n, int *max, int *min)
{ int i;
*max=x[0]; *min=x[0];
for(i=1;i
{
if(*max
*max=x[i];
if(x[i]<*min)
*min=x[i];
}
}
void main( )
{int x[10],i,min,max;
for(i=0;i<10;i++)
scanf("%d",x+i);
max_min(x,10,&max,&min);
printf("MAX=%d MIN=%d\n",max,min);
}
四、 双重循环
1. 求(n由输入决定)
#include
void main( )
{
int i,j,n;
long int t=1,sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++) {
t=1;
for(j=1;j<=i;j++)
t=t*j;
sum=sum+t;
}
printf("n!=%ld",sum);
}
2.输入一个3*6的二维整型数组数据,输出其中最大值及其所在行列下标。
#include
void main( )
{
int a[3][6],i,j,m,n,max;
for(i=0;i<3;i++)
for(j=0;j<6;j++)
scanf("%d",&a[i][j]);
max=a[0][0];
for(i=0;i<3;i++)
for(j=0;j<6;j++)
if(a[i][j]>max)
{
max=a[i][j];
m=i;n=j;
}
printf("the max num is %d, row %d line %d \n",max,m,n);
}
3. 鞍点问题:找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小
#define N 10
#define M 10
void main()
{
int i,j,k,m,n,flag1,flag2,a[N][M],max,maxi,maxj;
scanf("%d",&n);
scanf("%d",&m);
for(i=0;i
for(j=0;j
scanf("%d",&a[n][m]);
for(i=0;i
{
for(j=0;j
printf("%d",a[n][m]);
printf("\n");
}
flag2=0;
for(i=0;i
max=a[i][0];
for(j=0;j
if(a[i][j]>max)
{
max=a[i][j];
maxj=j;
}
for(k=0,flag1=1;k
if(max>a[k][maxj])
flag1=0;
if(flag1)
{
printf("\n第%d行,第%d列的%d是鞍点",i,maxj,max);
flag2=1;
}
}
if(!flag2) printf("\n 矩阵中无鞍点");
}
五、 三种排序
1.选择排序:函数sort使用选择法将一维整型数组中各元素按值从大到小排序。
#include
#define N 10
void sort(int a[],int n)
{ int i,j,k,temp;
for(i=0; i
k=i;
for(j=i+1; j
temp=a[k]; a[k]=a[i];a[i]=temp;
}
}
void main()
{
int a[N],i;
for(i=0;i
scanf("%d",&a[i]);
sort(a,N);
for(i=0;i
printf("%d ",a[i]);
}
2. 冒泡法
#include
void main( )
{
int a[10] , i , j ,t ;
printf("Input 10 numbers:\n") ;
for(i=0 ;i<10 ; i++) /* 输入排序数 */
scanf("%d",&a[i]) ;
printf("\n");
for(j=0 ; j<9 ; j++ ) /* 控制比较趟数 */
for(i=0 ; i<9 -j ; i++ ) /* 控制比较对数 */
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1] ;
a[i+1]=t ;
}
printf(" The sorted number : \n") ;
for(i=0 ;i<10 ;i++) /* 输出已排序的数 */
printf("%d ", a[i]) ;
}
3.插入排序:将x插入到已从小到大排序好的数组a中,插入x后数组中的元素仍然有序
#include
#define N 5
void main()
{
int a[N],i,x,j;
scanf("%d",&a[0]);
for(i=1;i
{
scanf("%d",&x);
for(j=i-1;j>=0;j--)
if(a[j]>x)
a[j+1]=a[j];
else break;
a[j+1]=x;
}
}
for(i=0;i
printf("%d ",a[i]);
}
六、 二种查找
1. 顺序查找
设a是一个整型数组,n和x都是整数,数组a中各元素的值互异。请编写函数 find(a,n,x),在数组a的前n个元素中查找x, 如果找到,返回x在数组a中的位置;如果没有找到,返回0。
#include
#define N 5
int find(int *a, int n, int x)
{
int k=0,y=0;
for(k=0; k
if (a[k]==x) y=k+1;
return y;
}
void main()
{
int n,x,a[N],i;
for(i=0;i
scanf("%d",&a[i]);
printf("please input x and n\n");
scanf("%d%d",&x,&n);
while(x!=0){
if((i=find(a,n,x))!=0)
printf("%d is the %dth number",x,i);
else
printf("not found");
scanf("%d,%d",&x,&n);
}
}
2. 二分法查找(要求查找的数据要有序)
#include
#define N 10
int f(int x, int a[], int n)
{
int low,high, mid;
low=0; high=n-1;
int y=-1;
while(low<=high){
mid=(low+high) / 2;
if(x>a[mid]) low=mid+1;
else {y=mid;break;}
}
return y;
}
void main()
{
int i,x,n,a[N];
for(i=0;i
scanf("%d",&a[i]);
printf("please input x and n");
scanf("%d%d",&x,&n);
printf("%d\n", f(x, a, n));
}
七.三种遍历
1. 数组遍历
1)字符串与整数转换
说明】函数atoi的功能是将字符串转换成整数,如“atoi("-123")”将返回-123。#include
int atoil(char s[])
{
int k=0,sign,digit;
sign=1;
digit=0;
while(s[k]<'0'||s[k]>'9')
{
if(s[k]== '-')
{
sign=-1;
}
k++;
}
while(s[k]>='0'&&s[k]<= '9')
{
digit=digit*10+s[k]-'0';
k++;
}
return sign*digit;
}
void main()
{
char s[80];
int d;
scanf("%s",s);
d=atoil(s);
printf("%d",d);
}
2)数组逆置
(1)for(i=0;i<=n/2;i++)
{ t=a[i];a[i]=a[n-i-1];a[n-i-1]=t;}
(2)for(i=0,j=n-1;i
{ t=a[i];a[i]=a[j];a[j]=t;}
如何用指针表示?
3)strcpy,strcmp,strlen,strcat这四个函数用数组,指针实现
#include
void strcpy1(char*to,char *from)
{
while((*to=*from)!='\0')
{
to++;
from++;
}
}
void main()
{
char to[20],from[10];
scanf("%s%s",from,to);
strcpy1(to,from);
printf("%s\n",to);
}
4)进制转换
函数 xtoi 的功能是将放在字符串中的十六进制数(可以出现’0’~’9’、’a’~’f)转换成十进制整数。例如:调用 xtoi("1f") 将返回31。
#include
int xtoi1(char s[])
{
int k=0, d=0;
while(s[k] >= '0' && s[k] <= '9' || s[k] >= 'a' && s[k] <= 'f' )
{
if (s[k] >= '0' && s[k] <= '9')
d=d*16+s[k]-'0';
if (s[k] >= 'a' && s[k] <= 'f')
d=d*16+s[k]-87;
k++;
}
return d;}
void main()
{
char s[80];
int d;
scanf("%s",s);
d=xtoi1(s);
printf("%d",d);
}
2.链表遍历
链表的建立、插入、删除和输出
3.文件遍历
(1)下列程序将当前目录下的文本文件a.txt复制到b.txt,要求将a.txt中每1个非英文字符后的第1个小写英文字母改为大写字母写到文件b.txt中,其它字符复制时不变。
#include
#include
#include
void main()
{ FILE *f1,*f2 ;
int flag=1;
char ch;
if((f1=fopen("a.txt","r"))==NULL) {
printf("不能打开文件a.txt\n"); exit(0);
}
if((f2=fopen("b.txt","w"))==NULL) {
printf("不能打开文件b.txt\n"); exit(0);
}
while(!feof(f1)) {
ch=fgetc(f1);
if(flag==1 && ch>='a' && ch<='z')
fputc(ch-32,f2);
else
fputc(ch,f2);
if(!isalpha(ch)) flag=1;
else flag=0;
}
fclose(f1); fclose(f2);
}
八. 函数调用
1,值传递,地址传递
#include
printf("%d,%d,%d--",*x,y,z);
} void main() { x=2; y=3; z=4; p(&x,y); printf("%d,%d,%d--",x,y,z); p(&y,x); printf("%d,%d,%d\n",x,y,z); }2.静态局部变量
(1)函数f定义如下,执行语句“sum=f(5)+f(3);”后,sum的值应为 (35) 。
int f(int m)
{ static int i=0; int s=0;
for(; i<=m; i++) s+=i; return s;
}
A、21 B、16 C、15 D、8
(2) 写出下列程序的输出结果:
# include
int f(int x)
{ static y=1;
x+=y; y++;
return x;
}
void main()
{ int k;
k=f(3);
printf("%d %d\n",k,f(k));
}
3.递归调用
(1) 函数f定义如下,执行语句“m=f(5);”后,m的值应为 B 。
int f(int k)
{ if(k==0||k==1) return 1;
else return f(k-1)+f(k-2);
}
A、3 B、8 C、5 D、13
九.其他算法1.数学类问题(上机题)
1. 程序设计题:考生目录下有Design.c程序,请完成以下功能:数组元素x[i]、y[i]表示
平面 上某点坐标,统计10个点中同处在圆(x-1)*(x-1)+(y+0.5)*(y+0.5)=25与
(x-0.5)*(x- 0.5)+y*y=36内的点数k,并将变量k的值以格式"%d"写到考生目录下
新建文件design.dat。
#include
#include
void main()
{ FILE *p; int i,k=0;
float x[]={1.1,3.2,-2.5,5.67,3.42,-4.5,2.54,5.6,0.97,4.65};
float y[]={-6,4.3,4.5,3.67,2.42,2.54,5.6,-0.97,4.65,-3.33};
// 此处起要求考生自己编制程序
p=fopen("design.dat", "w");
for(i=0;i<10;i++)
if((sqrt((x[i]-1)*(x[i]-1)+(y[i]+0.5)*(y[i]+0.5))<5)&&
sqrt(((x[i]-0.5)*(x[i]-0.5)+(y[i]*y[i]))<6))
k++;
fprintf(p,"%d",k);
fclose(p);
}
2. 程序设计题:考生目录下有Design.c程序,请完成以下功能:数组元素x[i]、y[i]表示平面上某点坐标,统计所有各点间最短距离,并将其值以格式"%f"写到考生目录下新建文
件 design.dat。
#include
#include
#define len(x1,y1,x2,y2) sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
void main()
{ FILE *p; int i,j; float c,minc;
float x[]={1.1,3.2,-2.5,5.67,3.42,-4.5,2.54,5.6,0.97,4.65};
float y[]={-6,4.3,4.5,3.67,2.42,2.54,5.6,-0.97,4.65,-3.33};
minc=len(x[0],y[0],x[1],y[1]);
// 此处起要求考生自己编制程序
p=fopen("design.dat", "w");
for(i=0;i<9;i++)
for(j=i+1;j<10;j++)
if((c=len(x[i],y[i],x[j],y[j]))
minc=c;
fprintf(p,"%f",minc);
fclose(p);
}
2.结构体
输入某班30位学生的姓名及数学,英语,计算机三门课成绩,输出平均成绩>=60分的学生的姓名及其各门课的成绩。
#include
#define SIZE 30
struct student
{ char name[10];
int math, english, computer;
};
void main()
{ struct student s[SIZE];
int k,j,n,d[SIZE];
float average;
for(k=0;k
for(n=0,k=0;k
{
average=(s[k].math+s[k].englksh+s[k].computer)/3.0;
if ( 2 )
{
d[n]=k;
3 ;
}
}
for (k=0;k
{
j= 4 ;
printf("%10s %3d %3d%3d\n",s[j].name,s[j].math,s[j].english,s[j].computer);
}
}
2. 分支程序
阅读下列程序,写出运行结果。
程序1(8分)
#include
void main()
{ int m=18,s=0;
do {
switch(m%7) {
case 2 : m/=2;s+=2; break;
case 3 : m/=3;s+=3; break;
case 5 : m/=5;s+=5; break;
default : m--; s--;
};
printf("%d\n",s);
} while(m);
}
3. 指针
#include
void main()
{ void div(int*,int*);
int a[5]={-5,0,60,45,34},i=0,j=2;
while(a[i]<=0)
i++;
while(a[i]!=1)
div(a+i,&j);
}
void div(int *n,int *k)
{ if(*n%*k==0) {
printf("%d,%d\n",*n,*k);
*n/=*k;
}
else (*k)++;
}
程序3(3分)位运算
#include
void main()
{ int s[8],i; char ch='B'-1; /* 字符A的ASCII码为65 */
printf("%c %d\n",ch,ch);
for(i=7;i>=0;i--) {
s[i]=ch&1;
ch=ch>>1;
}
for(i=0;i<8;i++) printf("%d",s[i]);
printf("\n");
}
算法口诀:
累加累乘整除性,最大最小双重循,
二查三排三遍历,函数调用文件行。
本文来源:https://www.2haoxitong.net/k/doc/3b770e372b160b4e767fcfa6.html
文档为doc格式