当前位置:文档之家› C语言数组例题

C语言数组例题

6.1.1 Fibonacci数列/* Fibonacci数列递推求解 */main(){int k,n; long s,f[50];printf("求数列的第n项与前n项和,请输入n:");scanf("%d",&n);f[1]=1;f[2]=1;s=2; /* 数组元素与和变量赋初值 */ for(k=3;k<=n;k++){f[k]=f[k-1]+f[k-2]; /* 实施递推 */s+=f[k];} /* 实施求和 */printf("F数列第%d项为:%ld\n",n,f[n]);printf("F数前%d项之和为:%ld\n",n,s);}6.1.2 幂序列/* 幂序列程序 */main(){int k,n; long a,b,s,f[100];printf("求数列的第n项与前n项和,请输入n:");scanf("%d",&n);a=2;b=3;s=0;for(k=1;k<=n;k++){if(a<b){f[k]=a;a=a*2;} /* 用2的幂给f[k]赋值 */else {f[k]=b;b=b*3;} /* 用3的幂给f[k]赋值 */ s+=f[k];}printf("数列的第%d项为:%ld\n",n,f[n]);printf("数列的前%d项之和为:%ld\n",n,s);}6.1.3 双关系递推数列/* 双关系2x+1,3x+1递推 */main(){int n,i,j,h,m[1500];m[1]=1;scanf("%d",&n);for(i=1;i<=n;i++){m[2*i]=2*m[i]+1;m[2*i+1]=3*m[i]+1;for(j=i+2;j<=2*i+1;j++){if(m[i+1]>m[j]) /* m(i+1)与m(j)比较 */{h=m[j]; m[j]=m[i+1];m[i+1]=h;} /* 交换,使m(i +1)最小 */if(m[i+1]==m[j])m[j]=20000+j;}} /* 置m(j)为一出界大数,以避免重复 */for(i=1;i<=n;i++){printf(" %4d",m[i]);if(!(i%10)) printf("\n");}}6.1.4 复杂递推数列/* 2x+3y递推程序 */main(){int m,n,t,k,i,h,j,w,a[30000];printf("\n input m:");scanf("%d",&m);a[1]=1;a[2]=2;t=2;n=0;for(k=2;k<=m;k++){for(i=1;i<=k-1;i++){w=2*a[k]+3*a[i];if(w<=m && a[k]!=a[i]) a[++t]=w;/* 判断 w是否为递推项 */w=2*a[i]+3*a[k];if(w<=m && a[k]!=a[i]) a[++t]=w;}} /* 判断 w是否为递推项 */for(j=1;j<=m;j++){for(k=1;k<=t;k++)if(a[k]==j){n++;printf("%4d(%3d) ",j,n);break;}}printf("\n n=%d",n);}6.2.1 折叠方阵/* 层叠方阵 */main(){ int a,i,j,m,n,x,y,z[20][20];printf("输入方阵的行数m:\n");scanf("%d",&m);printf("输入方阵的起始数a:\n");scanf("%d",&a);z[1][1]=a;n=a;for(i=2;i<=m;i++){x=1;y=i;n++;z[x][y]=n; /* 每一层的起始元素赋值*/while(x<i){n++;x++;z[x][y]=n;} /* 每一层的纵元素赋值*/while(y>1){n++;y--;z[x][y]=n;} /* 每一层的横元素赋值*/}for(x=1;x<=m;x++){for(y=1;y<=m;y++)printf("%4d",z[x][y]); /* 循环打印层叠方阵 * /printf("\n"); }}6.2.2 矩阵的和与转置main(){ int i,j,m,n,x,y,a[4][5],b[4][5];printf("输入a矩阵:\n");for(i=1;i<=3;i++)for(j=1;j<=4;j++)scanf("%d",&a[i][j]); /* 输入a矩阵的元素 */ printf("输入b矩阵:\n");for(i=1;i<=3;i++)for(j=1;j<=4;j++)scanf("%d",&b[i][j]); /* 输入b矩阵的元素 */ printf("a矩阵:\n");for(i=1;i<=3;i++){{for(j=1;j<=4;j++)printf("%3d",a[i][j]);} /* 打印a矩阵 */ printf("\n"); }printf("b矩阵:\n");for(i=1;i<=3;i++){{for(j=1;j<=4;j++)printf("%3d",b[i][j]);} /* 打印b矩阵 */printf("\n");}printf("a,b矩阵之和:\n");for(i=1;i<=3;i++){{for(j=1;j<=4;j++)printf("%4d",a[i][j]+b[i][j]);} /* 计算并打印a+b 的元素 */printf("\n");}printf("a矩阵的转置:\n");for(j=1;j<=4;j++) /* 打印a矩阵的转置 */{{for(i=1;i<=3;i++)printf("%4d",a[i][j]);}printf("\n");}}6.2.3 矩阵的积/* 求a,b矩阵的积 */main(){ int i,j,k,d,a[4][5],b[5][3];printf("输入a矩阵:\n");for(i=1;i<=3;i++)for(j=1;j<=4;j++)scanf("%d",&a[i][j]); /* 输入a矩阵的元素 */printf("输入b矩阵:\n");for(i=1;i<=4;i++)for(j=1;j<=2;j++)scanf("%d",&b[i][j]); /* 输入b矩阵的元素 */printf("a矩阵:\n");for(i=1;i<=3;i++){{for(j=1;j<=4;j++)printf("%3d",a[i][j]);} /* 打印a矩阵 */printf("\n"); }printf("b矩阵:\n");for(i=1;i<=4;i++){{for(j=1;j<=2;j++)printf("%3d",b[i][j]);} /* 打印b矩阵 */printf("\n");}printf("a,b矩阵之积:\n");for(i=1;i<=3;i++){{for(j=1;j<=2;j++){for(d=0,k=1;k<=4;k++)d+=a[i][k]*b[k][j]; /* 求和计算积矩阵元素d (i,j) */printf("%6d",d);}} /* 打印a,b积矩阵元素d */printf("\n");}}6.2.4 杨辉三角形3.程序设计与运行/* 杨辉三角形 */main(){int n,i,j,k,a[20][20];scanf("%d",&n);for(i=1;i<=n;i++){a[i][1]=1;a[i][i]=1;} /* 确定初始条件 */for(i=3;i<=n;i++)for(j=2;j<=i-1;j++)a[i][j]=a[i-1][j-1]+a[i-1][j]; /* 递推得到每一数组元素 */for(i=1;i<=n;i++) /* 控制输出n行 */{printf("\n");for(k=1;k<=40-3*i;k++) printf(" ");for(j=1;j<=i;j++) /* 控制输出第i行的i个数组元素 */printf("%6d",a[i][j]);}}6.3.1 猴子爬山/* 猴子爬山n级,一步跨1级或3级台阶 */main(){int k,n;long f[1000];printf("请输入台阶总数n:");scanf("%d",&n);f[1]=1;f[2]=1;f[3]=2; /* 数组元素赋初值 */for(k=4;k<=n;k++)f[k]=f[k-1]+f[k-3]; /* 按递推关系实施递推 */printf("s=%ld",f[n]);}6.3.2 整币兑零main(){int x,f,t,n;x=0;for(t=0;t<=50;t++) /* 变量t为2元币的张数*/ for(f=0;f<=20;f++) /* 变量f为5元币的张数*/ {n=100-f*5-t*2; /* 变量n为1元币的张数*/if(n>=0) x++;} /* 变量n为非负时,用x统计兑零种数 */printf("%d",x);}6.3.3 整数拆分/* 连续数1-ms组合ss */#include <stdio.h>#define MAXN 100int a[MAXN],t,n=0;comb(int m,int k,int s) /* 建立递归函数comb(m, k, s) */{int i,j;for(i=m;i>=k;i--){a[k]=i;if(k>1)comb(i-1,k-1,s);else {for(t=0,j=a[0];j>0;j--)t=t+a[j];if(t==s) {n++;printf(“%d=”,s); /* 满足条件时输出*/for(j=a[0];j>1;j--){printf("%2d+",a[j]); }printf("%2d\n",a[1]); }}}}main(){int ms,ss,i,h,k,wmin,wmax;scanf("%d,%d",&ms,&ss);for(h=0,i=1;i<=ms;i++){h=h+i;if(h>ss) {wmax=i-1;break;}}for(h=0,i=1;i<=ms;i++){h=h+(ms-i+1);if(h>ss) {wmin=i-1;break;}}for(k=wmin;k<=wmax;k++){a[0]=k;comb(ms,k,ss);}printf("n=%d\n",n); } /* 输出拆分种数n */6.4.1 分类统计main(){int k,m,sm,i,j,h,t,f[1000],s[9],n[9],d[10][100];float x;sm=0;printf("请输入m个分数:\n");scanf("%d",&m);for(k=1;k<=m;k++){printf("请输入第%d个数:",k);scanf("%d",&f[k]);sm+=f[k]; /* sm统计总分 */t=f[k]/10;if(t<6) t=5;if(t>9) t=9; /* 计算确定分类号t */s[t]+=f[k]; n[t]++; d[t][n[t]]=f[k];}printf("所有%d个原始数据为:\n",m);for(k=1;k<=m;k++){printf("%4d",f[k]); /* 每行10个打印原始数据*/if(k%10==0) printf("\n");}printf("\n");for(t=5;t<=9;t++)for(i=1;i<=n[t]-1;i++) /* 分段按逐个比较法从小到大排序 */for(j=i+1;j<=n[t];j++)if(d[t][i]>d[t][j]){h=d[t][i];d[t][i]=d[t][j];d[t][j]=h;}for(t=9;t>=5;t--){printf("%d段共%3d个数据,从小到大依次为:",t,n[t]);for(k=1;k<=n[t];k++)printf("%4d",d[t][k]);x=(float)s[t]/n[t];printf(", 该段平均分为:%8.2f\n",x);}x=sm/m;printf("所有%d个数据的平均值为:%8.2f\n",m,x); }6.4.2 大赛现场统分/* 竞赛现场统分排序 */#include<stdio.h>#include<math.h>main(){int i,j,n,m,u,sh[40];float max,min,uf,sf[40], f[40][20];printf("请输入选手个数(1<n<40):");scanf("%d",&n);printf("请输入评委个数(2<m<20):");scanf("%d",&m);for(i=1;i<=n;i++) /* 现场为选手评分,报分 */{printf("\n第%d个上场选手编号为:",i);scanf("%d",&sh[i]);sf[i]=0;max=0;min=10000; /* 数组元素与变量赋初值 */for(j=1;j<=m;j++){printf("第%d个评委评分为:",j);scanf("%f",&f[i][j]);sf[i]+=f[i][j];if(max<f[i][j]) max=f[i][j];if(min>f[i][j]) min=f[i][j];}printf("\n去掉一个最高分:%.2f",max);printf("\n去掉一个最低分:%.2f",min);sf[i]=(sf[i]-max-min)/(m-2); /* 计算第i个选手的最后得分 */printf("\n编号为%d号选手",sh[i]);printf("最后得分为:%.2f\n",sf[i]);}for(i=1;i<=n-1;i++) /* 选手最后得分按冒泡法排序,打印名次表 */for(j=1;j<=n-i;j++)if(sf[j]<sf[j+1]){uf=sf[j];sf[j]=sf[j+1];sf[j+1]=uf; /* 交换sf 同时交换sh */u=sh[j];sh[j]=sh[j+1];sh[j+1]=u;}printf("\n 参赛选手得分名次表:"); /* 输出名次表 */printf("\n选手编号得分名次");for(i=1;i<=n;i++)printf("\n %d %.3f %d",sh[i],sf[i],i);printf("\n");printf("\n\n竞赛现场统分结束,谢谢!\n");}6.4.3 数制转换/* 十进制整数转换为P进制 */main(){long n;int c,m,k,p,s[100];char r[16];r[10]='A';r[11]='B';r[12]='C';r[13]='D';r[14]='E';r[15]='F';m=0;printf("\n请输入十进制数n:");scanf("%ld",&n);printf("\n请输入转换数制p(2-16):");scanf("%d",&p);printf("(%ld)10=(",n);while(n!=0){c=n%p;n=n/p;m++;s[m]=c;} /* 实施除P取余*/for(k=m;k>=1;k--) /* 从后往前逐位打印输出 */if(s[k]>9) printf("%c",r[s[k]]); /* 超过9时打印相应字母 */else printf("%d",s[k]);printf(")%d\n",p);}/* 十进制小数转换为P进制 */main(){float n;int c,m,k,p,t,s[100];char r[16];r[10]='A';r[11]='B';r[12]='C';r[13]='D';r[14]='E';r[15]='F';m=0;printf("\n请输入十进制纯小数n:");scanf("%f",&n);printf("\n请输入转换数制p(2-16):");scanf("%d",&p);printf("\n请输入最多转换的位数t:");scanf("%d",&t);printf("(%f)10=(0.",n);while(n!=0 && m<t){n=n*p;c=n;n=n-c;m++;s[m]=c;} /* 实施乘P取整 */ for(k=1;k<=m;k++) /* 从前往后逐位打印输出 */if(s[k]>9) printf("%c",r[s[k]]); /* 每一位超过9时打印相应字母 */else printf("%d",s[k]);printf(")%d\n",p);}6.4.4 真分数序列/* 求分母为[a,b]的最简真分数的增序列 */main(){int a,b,k,n,i,j,h,t,u,c[3000],d[3000];scanf("%d,%d",&a,&b); /* 输入区间的上下限*/scanf("%d",&k); /* 输入指定序号k */n=0;for(j=a;j<=b;j++){for(i=1;i<=j-1;i++){for(t=0,u=2;u<=i;u++)if(j%u==0 && i%u==0) {t=1;break;} /* 分子分母有公因数舍去 */if(t==0) {n++;c[n]=i;d[n]=j;}}}for(i=1;i<=n-1;i++) /* 应用冒泡法排序 */for(j=1;j<=n-i;j++)if(c[j]*d[j+1]>c[j+1]*d[j]) /* 若c(j)/d(j)>c(j+1)/d(j+1),交换 */{h=c[j];c[j]=c[j+1];c[j+1]=h;h=d[j];d[j]=d[j+1];d[j+1]=h;}printf("n=%d \n",n);printf("%d:%d/%d \n",k,c[k],d[k]);}6.5.1 优美乘积main(){long int x,y,t,i,k,m[4],f[11],a,b,c,n=0;for(a=2;a<=98;a++)for(b=102;b<=9876;b++) /* 对a,b 实施穷举 */{c=a*b;m[1]=a;m[2]=b;m[3]=c;for(i=0;i<=9;i++) f[i]=0;for(k=1;k<=3;k++){y=m[k];while(y>0){x=y%10;f[x]=f[x]+1;y=y/10;}} /* 分离数字,f 数组统计 */for(t=0,i=0;i<=9;i++)if(f[i]!=1) t=1; /* 检验数字0--9各只出现一次 */if(t==0){printf("%3ld*%4ld=%5ld ",a,b,c);n++; /* 用n 统计个数 */if(n%4==0) printf("\n");}}printf("\n n=%d.\n",n);}6.5.2 优美和/* 优美和程序 */main(){int a,b,c,x,y,t,i,k,m[4],f[11],n=0;for(a=10;a<=987;a++)for(b=102;b<=9876;b++) /* 对a,b 实施穷举 */{c=a+b;m[1]=a;m[2]=b;m[3]=c;for(i=0;i<=9;i++) f[i]=0;for(k=1;k<=3;k++){y=m[k];while(y>0){x=y%10;f[x]=f[x]+1;y=y/10;}} /* 分离数字,用f 数组统计 */for(t=0,i=0;i<=9;i++)if(f[i]!=1) t=1; /* 检验数字0——9是否各出现一次 */if(t==0 && a<b){printf("%3d+%4d=%4d ",a,b,c);n++; /* 打印,用n 统计个数 */if(n%5==0) printf("\n");}}printf("\n n=%d.\n",n);}6.5.3 桥本等式/* 桥本等式探求 */main(){ int g,i,j,k,n,a[10]; long m1,m2,m3;i=1;a[1]=1;n=0;while (1){g=1;for(k=i-1;k>=1;k--)if(a[i]==a[k]) g=0; /* 两数相同,标记g=0 */if(i==9 && g==1 && a[1]<a[4]){m1=a[2]*10+a[3];m2=a[5]*10+a[6];m3=a[8]*10+a[9];if(a[1]*m2*m3+a[4]*m1*m3==a[7]*m1*m2) /* 判断是否满足等式 */{n++;printf("(%2d). ",n);printf("%d/%ld+%d/",a[1],m1,a[4]);printf("%ld=%d/%ld\n",m2,a[7],m3);}}if(i<9 && g==1) {i++;a[i]=1;continue;} /* 不到9个数,往后继续 */for(j=1;j<=9;j++)if(a[i]==9 && i>1) i--;else break; /* 往前返回 */if(a[i]==9 && i==1) break;else a[i]++; /* 至第1个数为9,结束 */}}6.6.1 阶乘的右边非零位/* 求n!右边第一个非零数字 */main(){int n,k;long f[1000];f[1]=1;printf("n=");scanf("%d",&n);for(k=2;k<=n;k++){f[k]=(f[k-1]*k); /* 实施递推 */while(f[k]%10==0)f[k]=f[k]/10; /* 除去f[k]的右边零 */f[k]=f[k]%10000;} /* 取f[k]右边四位 */printf("\n f[%d]=%d ",n,f[n]%10);}6.6.2 筛法求素数/* 筛法求指定区间上的素数 */#include"math.h"main(){ long int c,d,i,j,k;static long int a[11000];int e,n;printf("求区间[c,d]上的素数\n");printf("请输入 c,d(c>2):");scanf("%ld,%ld",&c,&d);if (c%2==0) c++;e=(d-c)/2;i=1; /* 确定区间上e+1个奇数 */while (i<=sqrt(d)) /* 在[c,d]中筛选素数 */{i=i+2;j=i;while (j<=d){j=j+2*i; if(j>=c) a[(j-c)/2]=-1;}} /* 筛去标记-1 */for(n=0,k=0;k<=e;k++)if(a[k]!=-1) /* 输出所得素数 */{n++; printf("%ld ",c+2*k);if(n%10==0) printf("\n");}printf("\n[%ld,%ld]共%d个素数.\n",c,d,n);}6.6.3 最小的连续n个合数/* 求最小的连续n个合数*/#include"math.h"main(){ long int c,d,f,g,i,j,k,m,x;long int a[11000];int e,n,s,u,t;printf("求最小的n个连续合数,");printf("输入n(2--100):");scanf("%d",&n);c=3;d=c+20000;u=1;f=2;t=0;while (u) /* 在[c,d]中筛选素数 */{for(i=0;i<=10999;i++) a[i]=0;e=(d-c)/2;i=1;while (i<=sqrt(d)){i=i+2;g=2*(c/(2*i))+1;if(g*i>d) continue;if(g==1) g=3;j=i*g;while (j<=d){if(j>=c) a[(j-c)/2]=-1; /* 筛去标记-1 */j=j+2*i;}}for(u=1,k=0;k<=e;k++){if(a[k]!=-1){m=c+2*k; /* m即筛选所得素数 */if(m-f>=n+1 && t==0) /* 寻求最小的n个连续素数 */{printf("最小的%d个连续合数为:",n);printf("[%ld,%ld]",f+1,f+n);t=1;}f=m;}}c=m;d=c+20000;} /* 最大素数m赋给c,继续探求 */}6.6.4 圆周率π的高精度计算/* 高精度计算圆周率π */#include "math.h"main(){float s;int b,x,n,c,i,j,d,l,a[5000];printf("\n 输入精确位数:");scanf("%d",&x);for (s=0,n=1;n<=5000;n++) /* 累加确定计算的项数 */{s=s+log((2*n+1)/n);if (s/log(10)>x) break;}for (i=0;i<=x+1;i++) a[i]=0;for (c=1,j=n;j>=1;j--) /* 按公式分步计算 */{d=2*j+1;for (i=0;i<=x;i++){a[i]=c/d; c=(c%d)*10+a[i+1];}a[x+1]=c/d;for (b=0,i=x+1;i>=0;i--){a[i]=a[i]*j+b; b=a[i]/10;a[i]=a[i]%10;}a[0]=a[0]+1;c=a[0];}for (b=0,i=x+1;i>=0;i--){a[i]=a[i]*2+b; b=a[i]/10;a[i]=a[i]%10;}printf("\n pi=%d.",a[0]); /* 遂位输出计算结果 */for (l=10,i=1;i<=x;i++){ printf("%d",a[i]);l++;if (l%10==0) printf(" ");if (l%50==0) printf("\n");}}。

相关主题