c语言网络教室第六章答案
6-1. 求满足条件的等差数列前4项
成绩: 10 / 折扣: 0.8
有一正整数等差数列,其前四项之和是 m ,前四项之积是 n ,编程,输入 m 和 n ,输出此数列的前四项,若不存在这样的等差数列,则输出 No output
输入: m,n
输出: 满足条件数列的前四项
#include"stdio.h"
int main()
{int m,n,a,d,p=0;
scanf("%d %d",&m,&n);
if(m%2==0)
{for(a=1;a<=m/4;a++)
for(d=0;d<=(m-4)/6;d++)
if(2*a+3*d==m/2&&a*(a+d)*(a+2*d)*(a+3*d)==n)
{printf("%d,%d,%d,%d\n",a,a+d,a+2*d,a+3*d); p=1;}}
if(p==0) printf("No output\n");
}
6-2. 求整数平方的回文数
成绩: 10 / 折扣: 0.8
输入正整数 m 和 n ,输出 [m, n] 闭区间中满足下列条件的正整数及其平方:正整数的平方具有对称性质(也称为回文数) , 如: 11 的平方是 121 。若该区间不存在这样的正整数,则输出: No output
输入: m,n
输出: 满足条件的正整数及其平方
#include"stdio.h"
int main()
{int m,n,i=0,j,k=1,x,y,a[10],p=0,q=1;
scanf("%d %d",&m,&n);
for(x=m;x<=n;x++)
{y=x*x;
while(y/k>=1) {a[i]=y/k%10; k*=10; i++;}
for(j=0;j<i;j++) if(a[j]!=a[i-j-1]) q=0;
if(q==1) {printf("%d,%d\n",x,y); p=1;}
i=0; k=1; q=1;}
if(p==0) printf("No output\n");
}
6-3. 打印数字菱形
成绩: 10 / 折扣: 0.8
输入 n 值,输出如下例( n=4 )所示的数字菱形。
  4
 434
43234
4321234
43234
 434
  4
输入: n
输出: 数字菱形
友情提示:同学们总结一下打印星号组成的实心图形程序的编程思路:第一步,打印星号组成的正方形;第二步,改变每行星号的个数,打印每行星号数量不一样的图形;如果是空心图形,每行第一个和最后一个位置输出星号,其他位置输出空格。
现在我们练习输出变化的字符,在打印星号图形的基础上,原来输出*号的位置,将printf("*");改为printf("%2d",x);当然,原来输出一个*号的地方只占一个字符的位置,现在都要改为2个字符的位置,如果输出的是数字且多于2个,则要是%3d或%4d了。
x是多少呢?则要寻其规律,就是该输出位置与所在行列的关系。
注意给出的测试用例,输出的数字是左对齐啊。
#include"stdio.h"
int main()
{int n,i,j,x,y,a[20][20];
scanf("%d",&n);
for(i=1;i<=2*n-1;i++)
for(j=1;j<=2*n-1;j++)
{x=i-n; y=j-n;
if(x<0) x=-x;
if(y<0) y=-y;
if(x+y<n) a[i][j]=x+y+1;}
for(i=1;i<=2*n-1;i++)
{x=i-n;
if(x<0) x=-x;
for(j=1;j<=x;j++) printf("  ");
for(j=x+1;j<=2*n-x-1;j++) printf("%-2d",a[i][j]);
printf("\n");}
}
6-4. 打印空心字母菱形
成绩: 10 / 折扣: 0.8
输入 n 值和首字母,输出如下例( n=4 )所示的空心字母菱形。(输出仅限于字母)
B
C L
D  K
E    J
F  I
G H
F
输入: n 首字母
输出: 空心字母菱形
友情提示:在5-1题空心菱形的基础上,解决原输出*号的位置输出字符。每行的第一个字符是在给定的首字符的基础上,现输出字符的ASCII码值加1就是下一行的首字符,在第二行输出的尾字符的基础上,减1就是下一行的尾字符,根据给定的行数和首字符可以求出输出的第一个尾字符。
#include"stdio.h"
int main()
{int n,i,j,x,y;
char c;
scanf("%d %c",&n,&c);
for(i=1;i<2*n;i++)
{x=n-i;
if(x<0) x=-x;
if(i==1) {for(j=1;j<n;j++)
printf(" "); putchar(c);}
else for(j=1;j<=2*n-x-1;j++)
{if(j==x+1) {y=c+i-1; if(y>90) y=y-26; putchar(y);}
else if(j==2*n-x-1) {y=c+4*n-3-i; if(y>90) y=y-26; putchar(y);}
else printf(" ");}
printf("\n");}
}
6-5. 求等于其各位数字的阶乘之和的正整数
成绩: 10 / 折扣: 0.8
求这样一个 n 位数( >0 ),它等于其各位数字的阶乘之和。输入位数 n ,输出所有满足条件的 n 位数。例如, 145=1 ! +4 ! +5 !若不存在这样的 n 位数,则输出: "No output\n"。
输入: n
输出: 满足条件的 n 位数
#include"stdio.h"
int main()
{int n,p=0,a1,a2,a3,a4,a5,a6,a7,
b1,b2,b3,b4,b5,b6,b7,
c1,c2,c3,c4,c5,c6,c7;
scanf("%d",&n);
if(n==1) for(a1=1;a1<=9;a1++)
{c1=c2=c3=c4=c5=c6=c7=1;
for(b1=a1;b1>0;b1--) c1*=b1;
if(a1==c1) {printf("%d\n",c1); p=1;}}
if(n==2) for(a1=1;a1<=9;a1++) for(a2=0;a2<=9;a2++)
{c1=c2=c3=c4=c5=c6=c7=1;
for(b1=a1;b1>0;b1--) c1*=b1;
if(a2==0) c2=0; else for(b2=a2;b2>0;b2--) c2*=b2;
if(10*a1+a2==c1+c2) {printf("%d\n",c1+c2); p=1;}}
if(n==3) for(a1=1;a1<=9;a1++) for(a2=0;a2<=9;a2++) for(a3=0;a3<=9;a3++)
{c1=c2=c3=c4=c5=c6=c7=1; for(b1=a1;b1>0;b1--) c1*=b1;
if(a2==0) c2=0; else for(b2=a2;b2>0;b2--) c2*=b2;
if(a3==0) c3=0; else for(b3=a3;b3>0;b3--) c3*=b3;
if(100*a1+10*a2+a3==c1+c2+c3) {printf("%d\n",c1+c2+c3); p=1;}}
if(n==4) for(a1=1;a1<=9;a1++) for(a2=0;a2<=9;a2++)
for(a3=0;a3<=9;a3++) for(a4=0;a4<=9;a4++)
{c1=c2=c3=c4=c5=c6=c7=1;
for(b1=a1;b1>0;b1--) c1*=b1;
if(a2==0) c2=0; else for(b2=a2;b2>0;b2--) c2*=b2;
if(a3==0) c3=0; else for(b3=a3;b3>0;b3--) c3*=b3;
if(a4==0) c4=0; else for(b4=a4;b4>0;b4--) c4*=b4;
if(1000*a1+100*a2+10*a3+a4==c1+c2+c3+c4) {printf("%d\n",c1+c2+c3+c4); p=1;}}
if(n==5) for(a1=1;a1<=9;a1++) for(a2=0;a2<=9;a2++) for(a3=0;a3<=9;a3++)
for(a4=0;a4<=9;a4++) for(a5=0;a5<=9;a5++)
{c1=c2=c3=c4=c5=c6=c7=1;
for(b1=a1;b1>0;b1--) c1*=b1;
if(a2==0) c2=0; else for(b2=a2;b2>0;b2--) c2*=b2;
if(a3==0) c3=0; else for(b3=a3;b3>0;b3--) c3*=b3;
if(a4==0) c4=0; else for(b4=a4;b4>0;b4--) c4*=b4;
if(a5==0) c5=0; else for(b5=a5;b5>0;b5--) c5*=b5;
if(10000*a1+1000*a2+100*a3+10*a4+a5==c1+c2+c3+c4+c5)
{printf("%d\n",c1+c2+c3+c4+c5); p=1;}}
if(n==6) for(a1=1;a1<=9;a1++) for(a2=0;a2<=9;a2++) for(a3=0;a3<=9;a3++)
for(a4=0;a4<=9;a4++) for(a5=0;a5<=9;a5++) for(a6=0;a6<=9;a6++)
{c1=c2=c3=c4=c5=c6=c7=1;
for(b1=a1;b1>0;b1--) c1*=b1;
if(a2==0) c2=0; else for(b2=a2;b2>0;b2--) c2*=b2;
if(a3==0) c3=0; else for(b3=a3;b3>0;b3--) c3*=b3;
if(a4==0) c4=0; else for(b4=a4;b4>0;b4--) c4*=b4;
if(a5==0) c5=0; else for(b5=a5;b5>0;b5--) c5*=b5;
if(a6==0) c6=0; else for(b6=a6;b6>0;b6--) c6*=b6;
if(100000*a1+10000*a2+1000*a3+100*a4+10*a5+a6==c1+c2+c3+c4+c5+c6)
{printf("%d\n",c1+c2+c3+c4+c5+c6); p=1;}}
if(n==7) for(a1=1;a1<=9;a1++) for(a2=0;a2<=9;a2++) for(a3=0;a3<=9;a3++)
for(a4=0;a4<=9;a4++) for(a5=0;a5<=9;a5++) for(a6=0;a6<=9;a6++) for(a7=0;a7<=9;a7++)
{c1=c2=c3=c4=c5=c6=c7=1;
for(b1=a1;b1>0;b1--) c1*=b1;
if(a2==0) c2=0; else for(b2=a2;b2>0;b2--) c2*=b2;
if(a3==0) c3=0; else for(b3=a3;b3>0;b3--) c3*=b3;
if(a4==0) c4=0; else for(b4=a4;b4>0;b4--) c4*=b4;
if(a5==0) c5=0; else for(b5=a5;b5>0;b5--) c5*=b5;
if(a6==0) c6=0; else for(b6=a6;b6>0;b6--) c6*=b6;
if(a7==0) c7=0; else for(b7=a7;b7>0;b7--) c7*=b7;
if(1000000*a1+100000*a2+10000*a3+1000*a4+100*a5+10*a6+a7==c1+c2+c3+c4+c5+c6+c7)
{printf("%d\n",c1+c2+c3+c4+c5+c6+c7); p=1;}}
if(p==0) printf("No output\n");
}
6-6. 兵乓球比赛的对阵方案
成绩: 10 / 折扣: 0.8
两个乒乓球队进行对抗赛,每队各出 n 名队员,比赛采用 n 场单打形式,每队每场派1名队员上场单打,每名队员必须且只能上场1次,两两捉对进行比赛决定胜负。甲队队员编号用 A、B、C、...,乙队队员用标号1、2、3、...。请给出可能的所有对阵方案(不用考虑对阵的顺序,就是说“A-1、B-2、C-3”与“B-2、A-1、C-3”与“B-2、C-3,A-1”与“C-3、A-1、B-2”与......,算一种方案。)n不大于7。
对阵中,不能出现重复方案,例如“Apk1 Bpk2 Cpk3”和“Apk1 Bpk3 Cpk2”两个方案中都出现了“Apk1”,算重复,只能选取一个!
输入:n
输出:对阵方案。
#include"stdio.h"
int main()
{int n,i,j,x;
scanf("%d",&n);
for(i=1;i<=n;i++)
{printf("scheme %d:\n",i);
for(j=1;j<=n;j++)
{x=i+j-1; if(x>n) x=x-n;
putchar(64+j); printf(" pk %d\n",x);}}
}
6-7 就是要让你晕
成绩: 10 / 折扣: 0.8
看着这样的“回”形图案你晕吗?
让我们不用数组,来做出它。
输入:
n。正方形的边长
输出:
边长为 n 的数字回形方阵。
#include"stdio.h"
int main()
{int a[10][10],n,i,j;
scanf("%d",&n);
if(n%2==1)
{for(i=1;i<(n+1)/2;i++)
{for(j=i;j<=n-i+1;j++)
a[i][j]=n*n-(n-2*i+2)*(n-2*i+2)+j-i+1;}
for(i=(n+1)/2;i<=n;i++)
{for(j=n-i+1;j<=i;j++)
a[i][j]=n*n-(2*i-n-1)*(2*i-n-1)+i-j;}
for(j=1;j<(n+1)/2;j++)
{for(i=j+1;i<=n-j
+1;i++)
a[i][j]=n*n-(n+1-2*j)*(n+1-2*j)+(2*n-3*j-i+2);}
for(j=(n+1)/2;j<=n;j++)
{for(i=n-j+1;i<j;i++)
a[i][j]=n*n-(2*j-n-1)*(2*j-n-1)+i-j;}}
else
{for(i=1;i<=n/2;i++)
{for(j=i;j<=n-i+1;j++)
a[i][j]=n*n-(n-2*i+2)*(n-2*i+2)+j-i+1;}
for(i=n/2+1;i<=n;i++)
{for(j=n-i+1;j<=i;j++)
a[i][j]=n*n-(2*i-n-1)*(2*i-n-1)+i-j;}
for(j=1;j<=n/2;j++)
{for(i=j+1;i<=n-j+1;i++)
a[i][j]=n*n-(n+1-2*j)*(n+1-2*j)+(2*n-3*j-i+2);}
for(j=n/2+1;j<=n;j++)
{for(i=n-j+1;i<=j;i++)
a[i][j]=n*n-(2*j-n-1)*(2*j-n-1)+i-j;}}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf("%3d",a[i][j]);
printf能输出空格吗printf("\n");}
}
6-8:数制转换
成绩: 10 / 折扣: 0.8
我们通常使用的都是十进制的数字,但其实在生活中也经常会使用其它进制。
这个题目会给你两个不同的数字,它们不属于同一进制,要求你计算出当它们分别处于何种进制之中时,两个数字相等。譬如 12 和 5 ,在十进制下它们是不等的,但若 12 使用 3 进制而 5 使用六进制或十进制时,它们的值就是相等的。因此只要选择合适的进制, 12 和 5 就可以是相等的。
程序的输入是两个数字 M 和 N( 其十进制的值不超过 1000000000) ,它们的进制在 2~36 之间。对于十以下的数字,用 0~9 表示,而十以上的数字,则使用大写的 A~Z 表示。
求出分别在 2~36 哪种进制下 M 和 N 相等。若相等则输出相应的进制,若不等则输出错误信息。当然了,对于多种可能成立的情况,出符合要求的进制最小的一组就行了。信息的格式见测试用例。
#include"stdio.h"
#include"math.h"
#include"string.h"
int main()
{int M,N,m,n,i,j,k,x,y,p=0,q;
char a[100],b[100];
scanf("%s %s",&a,&b);
m=strlen(a); n=strlen(b);
for(i=2;i<=36;i++) for(j=2;j<=36;j++)
{q=1; M=0; N=0;
for(k=0;k<m;k++) {if(a[k]<58) x=a[k]-48; else x=a[k]-55; if(x>=i) q=0; M+=x*pow(i,m-k-1);}
for(k=0;k<n;k++) {if(b[k]<58) y=b[k]-48; else y=b[k]-55; if(y>=j) q=0; N+=y*pow(j,n-k-1);}
if(q==0) continue;
if(M==N) {printf("%s (base %d) = %s (base %d)\n",a,i,b,j); p=1; break;}}
if(p==0) printf("%s is not equal to %s in any base 2..36\n",a,b);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。