c语言网络教室第五章和第三章答案
第五章:
5-1. 打印空心菱形
成绩: 10 / 折扣: 0.8
输入图形的高 n 和顶行字符 c 。输出如下例( c='A' , n=5 )所示的图形。
A
B    B
C        C
D              D
E                    E
D              D
C        C
B    B
A         
输入: 高 n 和顶行字符 c
输出: 空心菱形
#include"stdio.h"
main()
{int n,i,j;
char c;
scanf("%d,%d",&n,&c);
c=getchar();
for(i=1;i<=n;i++)
{for(j=1;j<=n+i-1;j++)
{if(j==n-i+1||j==n+i-1) putchar(c+i-1);
else printf(" ");}
printf("\n");}
for(i=1;i<=n-1;i++)
{for(j=1;j<=2*n-i-1;j++)
{if(j==i+1||j==2*n-i-1) putchar(c+n-i-1);
else printf(" ");}
printf("\n");}
}
5-2. 求各位数字之和等于5且能被5整除的整数
成绩: 10 / 折扣: 0.8
输入正整数 M 和 N(M,N 均小于 10000) ,输出 M 和 N 之间所有满足下列条件的所有整数:整数的各位数字之和等于 5 且能被 5 整除。若没有满足条件的整数 , 则输出 : No output
输入: 整数区间 m,n
输出: 各位数字之和等于 5 且能被 5 整除的所有整数
#include"stdio.h"
int main()
{int M,N,K,a,b,c,d,p=0;
scanf("%d %d",&M,&N);
for(K=M;K<=N;K++)
{a=K/1000; b=K/100%10;
c=K/10%10; d=K%10;
if(a+b+c+d==5&&K%5==0)
{printf("%d\n",K); p=1;}}
if(p==0) printf("No output\n");
}
5-3. 学生成绩排序
成绩: 10 / 折扣: 0.8
按学生的序号输入 n 名学生的成绩,按照分数由高到低的顺序输出学生的名次、序号和成绩,要求成绩相同的学生具有相同的名次。
输入: 学生人数和 n 名学生的成绩
输出: 按 分数由高到低的顺序输出学生的名次、序号和成绩
#include"stdio.h"
int main()
{int n,i,j,k,a[20],b[20];
scanf("%d\n",&n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
b[0]=b[n-1]=a[0];
for(i=0;i<n;i++) {if(a[i]>b[0]) b[0]=a[i];
if(a[i]<b[n-1]) b[n-1]=a[i];}
for(i=1;i<n;i++) b[i]=b[n-1];
for(i=0;i<n-2;i++) {for(j=0;j<n;j++)
if(a[j]<b[i]&&a[j]>b[i+1]) b[i+1]=a[j];}
for(i=0;i<n-1;i++) if(b[i]==b[i+1]) break;
for(j=0;j<=i;j++) {for(k=0;k<n;k++)
if(a[k]==b[j]) printf("%d:%d,%d\n",j+1,k+1,a[k]);}
}
5-4. 打印×空心菱形
成绩: 10 / 折扣: 0.8
输入图形的高, 输出如下例(n=5时)所示的图形。
*
*  *
*    *
*      *
*        *
*      *
*    *
*  *
*
输入: 高 n 
输出: 空心菱形
友情提示:第一步,先输出由*号组成的n行的实心正三角形和n-1行的实心倒三角形;
第二步,通过判断原每行的第一个和最后一个输出*号,其余位置输出空格。
#i
nclude"stdio.h"
int main()
{int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{for(j=1;j<=n+i-1;j++)
{if(j==n-i+1||j==n+i-1) printf("*");
else printf(" ");}
printf("\n");}
for(i=1;i<=n-1;i++)
{for(j=1;j<=2*n-i-1;j++)
{if(j==i+1||j==2*n-i-1) printf("*");
else printf(" ");}
printf("\n");}
}
5-5. 马戏团观众人数
成绩: 10 / 折扣: 0.8
一个马戏团表演, n 个座位全满,全部门票收入是 120 元,现在知道,男人每人 5 元,女人每人 2 元,小孩每人 1 角。编程,输入总人数 n ,输出满足要求的男人、女人和小孩人数的全部方案。若 n 人无法满足条件,则输出“No output\n”。
输入: 人数 n
输出: 男人、女人和小孩人数
#include"stdio.h"
int main()
{int n,a,b,c,p=0;
scanf("%d",&n);
for(a=0;a<=24;a++) for(b=0;b<=60;b++)
{c=n-a-b; if(50*a+20*b+c==1200&&c>=0)
{printf("%d,%d,%d\n",a,b,c); p=1;}}
if(p==0) printf("No output\n");
}
5-6. 求各位数字组成的最大数
成绩: 10 / 折扣: 0.8
任意输入一个自然数(不大于99999999),输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531 。
输入: 自然数 n
输出: 各位数字组成的最大数
#include"stdio.h"
int main()
{int N,i=0,j,k=1,p,q,a[8],b[8];
static int c[8]={0};
scanf("%d",&N);
while(N/k*10>=10)
{a[i]=N/k%10; k=10*k; i++;}
b[0]=b[i-1]=a[0];
for(j=0;j<i;j++) {if(a[j]>b[0]) b[0]=a[j];
if(a[j]<b[i-1]) b[i-1]=a[j];}
for(j=1;j<i;j++) b[j]=b[i-1];
for(j=0;j<i-2;j++) {for(p=0;p<i;p++)
if(a[p]<b[j]&&a[p]>b[j+1]) b[j+1]=a[p];}
for(j=1;j<i;j++) if(b[j-1]==b[j]) break;
for(p=0;p<j;p++) {for(q=0;q<i;q++)
if(a[q]==b[p]) c[p]=c[p]+1;}
for(p=0;p<j;p++) {for(q=0;q<c[p];q++) printf("%d",b[p]);}
printf("\n");
}
5-7. 寻特殊整数
成绩: 5 / 折扣: 0.8
请编写一个程序寻一种特殊整数:一个 n 位的正整数等于其各位数字的n次方之和。
例如:407=4×4×4+0×0×0+7×7×7。所以407就是一个特殊数。
输入:
正整数的位数n(n<=6)。
输出:
所有此n位特殊数。每个数占一行。若不存在符合条件的特殊数,则输出提示:“No output.”;若存在,则从小到大进行输出。
说明:
假设输入为4,在4位整数中,有3个4位的特殊数,则输出格式为(输出中的1111、2222和9999并不是4位特殊数,只是格式样例):
1111
2222
9999
#include"stdio.h"
int main()
{int x,i,j,k,l,m,n,N=0,M=0,p=0;
scanf("%d",&x);
if(x==1) {for(i=1;i<=9;i++) printf("%d\n",i); p=1;}
if(x==2) for(i=1;i<=9;i++) for(j=0;j<=9;j++)
{M=i*i+j*j; N=10*i+j; if(M==N) {printf("%d\n",N); p=1;}}
if(x==3) for(i=1;i<=9;i++) for(j=0;j<=9;j++) for(k=0;k<=9;k++)
{M=i*i*i+j*j*j+k*k*k; N=100*i+10*j+k; if(M==N) {printf("%d\n",N); p=1;}}     
if(x==4)
for(i=1;i<=9;i++) for(j=0;j<=9;j++)
for(k=0;k<=9;k++) for(l=0;l<=9;l++)
{M=i*i*i*i+j*j*j*j+k*k*k*k+l*l*l*l; N=1000*i+100*j+10*k+l;
if(M==N) {printf("%d\n",N); p=1;}}
if(x==5) for(i=1;i<=9;i++) for(j=0;j<=9;j++)
for(k=0;k<=9;k++) for(l=0;l<=9;l++) for(m=0;m<=9;m++)
{M=i*i*i*i*i+j*j*j*j*j+k*k*k*k*k+l*l*l*l*l+m*m*m*m*m; N=10000*i+1000*j+100*k+10*l+m;
if(M==N) {printf("%d\n",N); p=1;}}
if(x==6) for(i=1;i<=9;i++) for(j=0;j<=9;j++) for(k=0;k<=9;k++)
for(l=0;l<=9;l++) for(m=0;m<=9;m++) for(n=0;n<=9;n++)
{M=i*i*i*i*i*i+j*j*j*j*j*j+k*k*k*k*k*k+l*l*l*l*l*l+m*m*m*m*m*m+n*n*n*n*n*n;
N=100000*i+10000*j+1000*k+100*l+10*m+n; if(M==N) {printf("%d\n",N); p=1;}}
if(p==0) printf("No output.\n");
5-8:计算通用产品代码(UPC)的校验位
成绩: 10 / 折扣: 0.8
背景
许多年来,货物生产商都会把超市售卖的每件商品上放置一个条码。这种被称为通用产品代码(Universal Product Code,缩写UPC)的条码可以识别生产商和产品。超市可以通过扫描产品上的条码来确定支付此项商品的费用。每一个条码由十二位数字构成,通常这些数字会显示在条码下面。例如,包装为26盎司的Morton牌碘化盐所用条码下的数字是:
0 24600 01003 0
第一个数字表示商品的种类(0表示大部分的食品杂货,2表示需要称量的货品,3表示药品或和健康相关的商品,而5表示优惠券)。接下来的一组五位数字用来识别生产商。而第二组五位数字则用来区分产品类型(其中包括包装尺寸)。最后一位数字是“校验位”,它可以帮助鉴别先前数字中的错误。如果
条码扫描出现错误,那么前十一位数字和最后一位数字可能会不一致,而超市扫描机也会拒绝整个条码。
下面是一种计算校验位的方法:首先把第一位、第三位、第五位、第七位、第九位和第十一位数字相加。然后把第二位、第四位、第六位、第八位和第十位数字相加。接着把第一次加法结果乘以3后再加上第二次加法的结果。随后,再把上述结果减去1。减法后的结果除以10取余数。最后,用9减去上一步骤中得到的余数。现在以Morton碘盐为例,第一组数字的加法是0+4+0+0+0+3=7,而第二组数字的加法是2+6+0+1+0=9。把第一组加法值乘以3后再加上第二组加法值得到的结果是30。再减去1,结果变为29。再把这个值除以10取余数为9。9在减去余数结果9,最终值为0。
输入
每次输入三行数据,第一行是UPC的第一位数字,第二行是UPC的第一组五位数字,第三行是UPC的第二组五位数字。
输出
UPC的校验位
提示
本题有隐藏测试用例。如果想多不同的实例验证你的算法,可以拿身边书或食品背后的条码测试一下。
#include"stdio.h"
main()
{int a,b,c,x,y=0,
i=0,j=1,k,n[10];
int m[10]={0};
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&c);
while(b/j>=1)
{m[i]=b/j%10; j=10*j; i++;}
for(i=0;i<5;i++) n[i]=m[4-i];
i=5; j=1;
while(c/j*10>=10)
{m[i]=c/j%10; j=10*j; i++;}
for(i=5;i<10;i++) n[i]=m[14-i];
x=a;
for(i=0;i<10;i++)
{if(i%2==1) x=x+n[i]; else y=y+n[i];}
k=9-(3*x+y-1)%10;printf直接输出数字
printf("%d\n",k);
}
第三章:
3-1. 打印菱形图形
成绩: 10 / 折扣: 0.8
输入 n ,输出如下例( n=3 )所示的边长为 n 的菱形:
*
***
*****
***
*
输入: 边长 n
输出: 边长为 n 的菱形
#include"stdio.h"
main()
{int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{for(j=1;j<=n-i;j++) printf(" ");
for(j=1;j<=2*i-1;j++) printf("*");
printf("\n");}
for(i=1;i<=n-1;i++)
{for(j=1;j<=i;j++) printf(" ");
for(j=1;j<=2*n-2*i-1;j++) printf("*");
printf("\n");}
}
3-2. 打印平行四边形
成绩: 10 / 折扣: 0.8
输入图形的高 n 和首字符 c ,输出如下例( c='A' , n=5 )所示的图形 .
ABCDE
BCDEF
CDEFG
DEFGH
EFGHI
输入: 高 n 和首字符 c
输出: 高为 n 和首字符为 c 的平行四边形
#include"stdio.h"
main()
{int n,i,j;
char c;
scanf("%d,&c",&n,&c);
c=getchar();
for(i=1;i<=n;i++)
{for(j=1;j<=i-1;j++) printf(" ");
for(j=1;j<=n;j++) putchar(c+i+j-2);
printf("\n");}
}
3-3. 求和
成绩: 10 / 折扣: 0.8
输入整数 m 和正整数 n ,按下列公式计算 s :
s=m-(m+1)+m+2-(m+3)+ …… +(-1)n(m+n) 。
输入: m 和 n
输出: s
#include"stdio.h"
main()
{int m,n,s,k,i,j;
scanf("%d %d",&m,&n);
s=m;
for(i=1;i<=n;i++)
{k=m+i;
for(j=1;j<=i;j++) k=(-1)*k;
s=s+k;}
printf("s=%d\n",s);
}
3-4 字符加密输出
成绩: 10 / 折扣: 0.8
从键盘上输入一个字符,进行加密以后再输出在屏幕上。加密规律是:
输入小写英文字母时,输入a 输出Z、输入b输出Y、输入c输出X、...、输入z输出A。
输入大写英文字母时,将该字母ASCII码值再加上该值的1/2后输出所对应的字符,例如数字A的ASCII码值是65,加上其值的1/2后是98(小数四舍五入),则输出字符‘b’。
输入数字时,将该数字原ASCII码值再加上该值十进制的十位上的数后输出,例如数字9的ASCII码值是57,加上十位上的数5后是62,则输出字符‘>’。
输入其他字符时原样输出。
友情提示:整数之间运算的结果要取整,例如5/2的结果是2,而5.0/2.0对小数四舍五入的结果就是3.0了。所以输入大写英文字母时的输出要仔细考虑。
#include"stdio.h"
main()
{char c;
c=getchar();
if(c>=97&&c<=122) putchar(187-c);
else if(c>=65&&c<=90)
{if(c%2==0) putchar(c*3/2);
else putchar(c*3/2+1);}
else if(c>=48&&c<=57) putchar(c+c/10%10);
else putchar(c);
printf("\n");
}
3-5. 计算时钟的夹角
成绩: 10 / 折扣: 0.8
背景:
钟面上的时针和分针之间的夹角总是在 0 度~ 359 度之间。举例来说,在十二点的时候两针之间的夹角
为 0 度,而在六点的时候夹角为 180 度,在三点的时候为 90 度。本题要解决的是计算 12:00 到 11:59 之间任意一个时间的夹角。
输入:
每组测试数据包含两个数字:第一个数字代表小时 ( 大于等于 0 小于等于 12) ,第二个数字代表分 ( 在区间 [0, 59] 上 ) 。
输出:
对应每组测试数据,用常用格式显示时间以及这个时候时针和分针间的最小夹角,精确到小数点后一位。输出格式如下所示。
输入:12 30
输出:At 12:30 the angle is 165.0 degrees.
友情提示:以表中心到12点的连线为基准,分针每走1分钟是6度,时针与基准的夹角每个小时也是30度,从整点开始,每过1分钟时针再增加0.5度。
#include"stdio.h"
main()
{int a,b;
float x;
scanf("%d %d",&a,&b);
if(a<12) x=30*a+0.5*b-6*b;
else x=0.5*b-6*b;
if(x<0) x=-x;
if(b>=10) printf("At %d:%d the angle is %.1f degrees.\n",a,b,x);
else printf("At %d:0%d the angle is %.1f degrees.\n",a,b,x);
}
3-6. 求亲密数
成绩: 10 / 折扣: 0.8
若正整数A的全部约数(包括1,不包括A本身)之和等于B ; 且整数B的全部约数(包括1,不包括B本身)之和等于A,则 A 、 B 为亲密数。编程,输入正整数A,输出亲密数 A , B(A<=B) ,若不存在亲密数,则输出“No output(回车)” 。
例如:220和284就是一对亲密数。220的约数是:1、2、4、5、10、11、20、22、44、55、110,约数之和是284;284的约数是:1、2、4、71、142,约数之和是220。
#include"stdio.h"
main()
{int A,B=0,C=0,i,k;
scanf("%d",&A);
for(i=2;i<=A;i++)
{k=A/i;
if(A%i==0) B=B+k;}
for(i=2;i<=B;i++)
{k=B/i;
if(B%i==0) C=C+k;}
if(A==C) {if(A<B) printf("%d-%d\n",A,B);
else if(A>B) printf("%d-%d\n",B,A);}
else printf("No output\n");
}