C语言程序设计(第四版)谭浩强版 课后答案 第六章
1、筛选法:可以先到网上看看定义在写算法
#include<stdio.h> int main(){ int a[100]; int i,j; for(i=0;i<100;i++){ a[i]=i+1; } a[0] = 0; for(i=0;i<100;i++){ for(j=i+1;j<100;j++){ if(a[i]!=0&&a[j]!=0){ if(a[j]%a[i]==0){ a[j]=0; } } } } printf("the prime number of 1-100 are:\n"); for(i=0,j=0;i<100;i++){ if(a[i]!=0){ printf("%d ",a[i]); j++; if(j==5){ j=0; printf("\n"); } } } return 0; }
2、选择排序(从小到大),每次选择一个最小的出来
#include<stdio.h> int main(){ int a[10]; int i,j,min,temp; printf("please input 10 numbers:"); for(i=0;i<10;i++){ scanf("%d",&a[i]); } for(i=0;i<10;i++){ min=a[i]; for(j=i+1;j<10;j++){ if(min>a[j]){ temp=min; min=a[j]; a[j]=temp; } } a[i]=min; } for(i=0;i<10;i++){ printf("%d ",a[i]); } printf("\n"); return 0; }
3、此处代码没有做输出,直接复制,若需输入则可以做一个双层循环
#include<stdio.h> int main(){ int a[3][3] = {{1,2,3},{1,2,3},{1,2,3}}; int i,j,sum = 0; for(i=0;i<3;i++){ for(j=0;j<3;j++){ if(j==i){ sum+=a[i][j]; } } } printf("the diagoline sum is:%d\n",sum); return 0; }
4、插入如何往后移,从最后一个一个往后拿最简单,但是这个程序插入的数是最大时,运行错误,索性直接把最大的情况,单独拿出来描述。
#include<stdio.h> int main(){ int a[100]; int n,x,i,j; printf("how many number you want enter:"); scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&a[i]); } printf("please input the number you want insert:"); scanf("%d",&x); if (x>a[n-1]){ a[n]=x; } else{ for(i=0;i<n;i++){ if(a[i]>x){ for(j=n;j>i;j--){ a[j]=a[j-1]; } a[i]=x; break; } } } for(i=0;i<=n;i++){ printf("%d ",a[i]); } printf("\n"); return 0; }
5、将一组有序数逆序输出
#include<stdio.h> int main(){ int a[100]; int t,n,i,j; printf("how many number you want enter:"); scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&a[i]); } for(i=0,j=n-1;i<=n/2;i++){ t = a[i]; a[i]=a[j]; a[j]=t; j--; } for(i=0;i<n;i++){ printf("%d ",a[i]); } printf("\n"); }
6、输出杨辉三角
#include<stdio.h> int main(){ int a[10][10]={0}; a[0][0]=1; a[1][0]=1; a[1][1]=1; int i,j; for(i=2;i<10;i++){ a[i][0]=1; a[i][i]=1; for(j=1;j<i;j++){ a[i][j]=a[i-1][j-1]+a[i-1][j]; } } for(i=0;i<10;i++){ for(j=0;j<10;j++){ if(a[i][j]!=0){ printf("%d ",a[i][j]); } } printf("\n"); } return 0; }
7、
(1)将1放在第1行中间一列。
(2) 从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5 在4的上一行后一列)。
(3)如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如,1在第1行,则⒉应放在最下一行,列数同样加1。
(4) 当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如,2在第3行最后一列,则3应放在第2行第1列。
(5) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。例如,按上面的规定,4应该放在第1行第2列,但该位置已被1占据,所以4就放在3的下面.由于6是第1行第3列(即最后一列),故7放在6下面。
按此方法可以得到任何阶的魔方阵。
#include<stdio.h> int main(){ int a[20][20]; int n,i,j,k; printf("please input the order:"); scanf("%d",&n); for(i=0;i<n;i++){ for(j=0;j<n;j++){ a[i][j]=0; } } //先找1存放的位置 i=0; j=n/2; a[i][j]=1; for(k=2;k<=n*n;k++){ i=i-1; j=j+1; if((i<0)&&(j==n)){ i=i+2; j=j-1; }else{ if(i<0) i=n-1; if(j==n) j=0; } if(a[i][j]==0){ a[i][j]=k; }else{ i = i+2; j=j-1; a[i][j]=k; } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("%5d",a[i][j]); } printf("\n"); } return 0; }