北理c语言上机答案(全)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 Hello world
让我们用C语言向世界问好。
最早的程序基本是这个样子的:
程序一:
#include <>
void main()
{
printf("Hello world.\n");
}
程序二:
#include <>
int main()
{
printf("Hello world.\n");
return 0;
}
上面的程序你任意模仿一个,看看是否可以通过如果你能通过这个简单的程序,那就让我们继续完成后面的习题吧。
输入:无
输出:Hello world.
程序实例1:
#include<>
void main()
{
printf("Hello world.\n");
}
结果:
Hello world.
程序实例2:
#include <>
int main()
{
printf("Hello world.\n");
return 0;
}
结果:
Hello world.
1. Welcome to Beijing.
让我们来练习如何显示多行文字。
输入:无
输出:就是下面的那段文字。
程序实例1:
#include""
int main()
{
printf("Welcome\n");
printf("to\n");
printf("Beijing.\n");
return 0;
}
Welcome
to
Beijing.
程序实例2:
#include<>
void main()
{printf("Welcome\nto\nBeijing.\n");
}
结果:
Welcome
to
Beijing.
1练习最简单的printf和scanf
printf函数和scanf函数是C语言中最常用的函数之一,下面让我们练习一下吧。
输入:整型变量x的值。
输出:输出整型变量x对应的十进制、八进制和十六进制形式。
认真看看-1的八进制和十六进制输出,请想想是为什么。
程序实例1:
#include""
main()
{int x;
scanf("%d",&x);
printf("x=%d,x=%o,x=%x\n",x,x,x);
}
输入:-1
输出: x=-1,x=777,x=ffffffff
程序实例2:
#include ""
void main()
{
long x;
scanf("%d",&x);
printf("x=%d,x=%o,x=%0x\n",x,x,x);
}
结果:
输入:292
输出:x=292,x=444,x=124
1练习两个整数之间的运算
背景:基本练习。
输入:接受两个整数,每个整数之间使用空格分隔。
例如输入格式为:123 444输出:分别输出进行+、-、*、/、*之后的运行结果。
程序实例1:
#include<>
void main()
{int a,b,c,d,e,f,g;
scanf("%d %d",&a,&b);
printf("%d+%d=%d\n",a,b,c=a+b);
printf("%d-%d=%d\n",a,b,d=a-b);
printf("%d*%d=%d\n",a,b,e=a*b);
printf("%d/%d=%d\n",a,b,f=a/b);
printf("%d%%%d=%d\n",a,b,g=a%b);
}
结果:
输入:10 3
输出:
10+3=13
10-3=7
10*3=30
10/3=3
10%3=1
程序实例2:
#include <>
void main()
{int x1,x2,x3,x4,x5,a,b;
scanf("%d %d",&a,&b);
x1=a+b;
x2=a-b;
x3=a*b;
x4=a/b;
x5=a%b;
printf("%d+%d=%d\n%d-%d=%d\n%d*%d=%d\n%d/%d=%d\n%d%%%d=%d",a,b,x1,a,b,x2,a,b,x3,a,b ,x4,a,b,x5);
}
结果:
输入:123 444
输出:
123+444=567
123-444=-321
123*444=54612
123/444=0
123%444=123
1学习打印你的第一个图形
背景:
我们已经学习了printf函数,这里给出了一个小程序,它运行的结果是输出一个由星号(*)组成的4*4的正方形。
程序如下:
#include <>
void main()
{
printf("****\n");
printf("****\n");
printf("****\n");
printf("****\n");
}
要求:
按照上面的程序范例,编写一个小程序,要求输出的是 4 行由*号组成的等腰三角形。
输入:无。
输出:指定图形。
程序实例1:
#include<>
int main( void )
{
printf( " *\n" ); printf( " ***\n" ); printf( " *****\n" ); printf( "*******\n" ); return 0;
}
结果:
输入:无
输出:
*
***
*****
*******
程序实例2:
#include""
main()
{
printf(" *\n"); printf(" ***\n"); printf(" *****\n"); printf("*******\n"); }
结果:
输入:无
输出:
*
***
*****
*******
1温度转换(06秋)
背景:
经常出国旅行的驴友都知道,需要时时了解当地的气温状况,但不少国家采用了不同的温度计量单位:有些使用华氏温度标准(F),有些使用摄氏温度(C)。
现在,请你根据温度转换公式设计一个温度转换程序,可以进行温度转换。
如果输入摄氏温度,显示转换的华氏温度;如果输入华氏温度,显示转换的摄氏温度。
温度转换的公式为:F=(C×9/5)+32 ;C=(F-32)×5/9 ;式中F--华氏温度,C--摄氏温度。
输入:第一个数据(1 或 2 )确定转换的类型:华氏转摄氏(1);摄氏转华氏(2);
第二个数据是相应需要转换的温度值。
输出:相应的转换后的温度值(保留小数点后 2 位)。
程序实例1:
#include<>
void main()
{ int a;
float x,y;
scanf("%d%f",&a,&x);
if ( a==1 )
{ y=(x-32)*;
printf("The Centigrade is %.2f\n",y);
}
else if(a==2)
{ y=(x*+32;
printf("The Fahrenheit is %.2f\n",y);
}
}
结果:
输入:1 100
输出:The Centigrade is
输入:2
输出:The Fahrenheit is
程序实例2:
#include <>
void main()
{float C;int a;
scanf("%d %f",&a,&C);
switch (a)
{case 1: printf("The Centigrade is %.2f\n",(C-32)*5/9);break;
case 2: printf("The Fahrenheit is %.2f\n",(C*9/5)+32);break;
default: printf("error\n");}
}
结果:
输入:1 0
输出:The Centigrade is
输入:2 88
输出:The Fahrenheit is
2 计算圆柱的侧面积及体积
如果已知圆柱的底面半径 r ,以及高 h ,则可计算出圆柱的侧面积 s=2πrh ,体积 v=π r 2 h 。
其中π=
输入:第一行输入圆柱的底面半径 r
第二行输入圆柱的高 h
输出:s=< 圆柱的侧面积 >,v=< 圆柱的体积 > 要求
1. 所有变量都定义为双精度类型
2. 结果精确到小数点后两位
程序实例1:
#include <>
#include <>
void main()
{
double r,h,s,v,PAI=;
scanf("%lf\n%lf",&r,&h);
s=2*PAI*r*h;
v=PAI*r*r*h;
printf("s=%.2f,v=%.2f\n",s,v);
}
结果:
输入:
2
8
输出:s=,v=
程序实例2:
#include<>
void main()
{
double pi=;
int r,h;
scanf("%d",&r);
scanf("%d",&h);
printf("s=%,v=%\n",2*pi*r*h,pi*r*r*h);
}
输入:
5
10
输出:s=,v=
3 计算时钟的夹角
背景:
钟面上的时针和分针之间的夹角总是在 ~之间 ( 包括和 ) 。
举例来说,在十二点的时候两针之间的夹角为,而在六点的时候夹角为,在三点的时候为。
本题要解决的是计算 12:00 到11:59 之间任意一个时间的夹角。
输入:每组测试数据包含两个数字:第一个数字代表小时 ( 大于 0 小于等于 12) ,第二个数字代表分 ( 在区间 [0, 59] 上 ) 。
输出:对应每组测试数据,用常用格式显示时间以及这个时候时针和分针间的最小夹角,精确到小数点后一位。
输出格式如下所示。
程序实例1:
#include<>
void main()
{ float x,y,z;
scanf("%f %f",&x,&y);
z=6*y-(30*x+y/2);
{if (z<=-180) z+=360;
else if(z<0) z=-z;
else if (z>=180) z=360-z;
else z=z;}
if (y<10) printf("At %.0f:0%.0f the angle is %.1f degrees.",x,y,z); else printf("At %.0f:%.0f the angle is %.1f degrees.",x,y,z);
}
输入:12 0
输出:At 12:00 the angle is degrees.
程序实例2:
#include<>
#include<>
main()
{ int x,y; float z;
scanf("%d%d",&x,&y);
z=fabs(30*x-(float)y*11/2);
z=z>180360-z:z;
if(y<10) printf("At %d:0%d the angle is %.1f degrees.\n",x,y,z);
else printf("At %d:%d the angle is %.1f degrees.\n",x,y,z);
}
结果:
输入:12 30
输出:At 12:30 the angle is degrees.
4 判断三角形的形状
要求:
输入三角型的三条边,判断三角形的形状。
假设输入的三边边长均>0。
输入:三角型的3条边的长度(int型)。
输出:等边三角形:equilateral triangle
等腰三角形:isoceles triangle
不构成三角形:non-triangle
一般三角形:triangle
程序实例1:
#include<>
void main()
{int a,b,c;
scanf("%d %d %d",&a,&b,&c);
if(a+b<=c||a+c<=b||b+c<=a)
printf("non-triangle.");
else if(a==b&&b==c)
printf("equilateral triangle."); else if(a==b&&b!=c||a==c&&c!=b||b==c&&c!=a) printf("isoceles triangle.") ;
else printf("triangle.");
}
结果:
输入:2 2 2
输出:equilateral triangle.
程序实例2:
#include<>
void main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==b&&b==c&&c==a)
printf("equilateral triangle.\n");
elseif(a+b>c&&a+c>b&&b+c>a)
(a==b||b==c||c==a)printf("isocelestriangle.\n"):printf("triangle.\n");
else printf("non-triangle.\n");
}
结果:
输入:1 3 1
输出:non-triangle.
5 求解一元二次方程
初中的时候我们就会求解一元二次方程了,下面让我们来教计算机如何求解。
输入 a,b,c ,就一元二次方程 ax²+bx+c=0 的根。
输入:假设 a,b,c均int。
输出:要求输出的根为 double 型,保留 6 位小数。
程序实例1:
#include ""
#include ""
void main()
{int a,b,c,a2;
double x1=0,x2=0,q;
scanf("%d%d%d",&a,&b,&c);
q=b*b-4*a*c;
a2=2*a;
if(a==0)
printf("Input error!\n");
else printf("x=%.6f\n",-c*b);
}
else if(q>0)
printf("x1=%.6f\nx2=%.6f\n",(-b+sqrt(q))/a2,(-b-sqrt(q))/a2);
else if(q==0)
printf("x1=x2=%.6f\n",-b*a2);
else if(q<0)
{ if(b==0) printf("x1=%.6fi\nx2=%.6fi\n",sqrt(-q)/a2,-sqrt(-q)/a2);
else
printf("x1=%.6f+%.6fi\nx2=%.6f-%.6fi",-b*a2,sqrt(-q)/a2,*b/a2,sqrt(-q)/a2); }
}
结果:
输入: 0 0 0
输出:Input error!
输入:2 2 2
输出:
x1=+
x2=程序实例2:
#include<>
#include <>
void main()
{
double a,b,c,d;
scanf("%lf%lf%lf",&a,&b,&c);
if(a==0&&b==0) printf("Input error!\n");
else if(a==0) printf("x=%lf\n",c==00:-c/b);
else if(d==0) printf("x1=x2=%.6lf\n",b==00:-b/(2*a));
else if(d>0) printf("x1=%lf\nx2=%lf\n",(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)); else if(b==0) printf("x1=%lfi\nx2=-%lfi\n",sqrt(-d)/(2*a),sqrt(-d)/(2*a));
else
printf("x1=%lf+%lfi\nx2=%lf-%lfi\n",-b/(2*a),sqrt(-d)/(2*a),-b/(2*a),sqrt(-d)/(
2*a));
}
结果:
输入:10 0 0
输出:x1=x2=
你会输出一行星号吗(本题不记分噢)
我们才开始上机,现在需要我们用最简单得办法,在一行中输出N个星号。
输入:N值
输出:一行中N个星号。
程序实例1:
#include<>
void main()
{
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
printf("*");
printf("\n");
}
结果:
输入:4
输出:****
输入:8
输出: ********
6 计算SUM的值
已知公式:SUM = 1 + 1/2 + 1/3 + 1/4 + ... + 1/n 输入:n
输出:表达式 sum 的值。
结果保留 6 位小数。
程序实例1:
#include<>
void main()
{
int n,k;
double sum;
scanf("%d",&n);
sum=;
for(k=2;k<=n;k++)
sum=sum+k;
printf("sum=%.6lf\n",sum);
}
结果:
输入:1
输出:sum=
程序实例2:
#include<>
void main()
{
double sum,i;
int n;
scanf("%d",&n);
for(i=1,sum=0;i<=n;i++)
sum=sum+1/i;
printf("sum=%.6lf",sum);
}
结果:
输入: 3
输出:sum=
7 贪吃的猴子
有一只猴子,第一天摘了若干个桃子,当即吃了一半,但还觉得不过瘾,就又多吃了一个。
第2天早上又将剩下的桃子吃掉一半,还是觉得不过瘾,就又多吃了两个。
以后每天早上都吃了前一天剩下的一半加天数个(例如,第5天吃了前一天剩下的一般加5个)。
到第n天早上再想吃的时候,就只剩下一个桃子了。
输入:天数n
输出:第一天的桃子个数
程序实例1:
#include <>
void main()
{int n,i,y;
scanf( "%d",&n );
for( i=n-1, y=1 ; i>=1; i--)
y = 2*(i+y);
if( y==1 )printf( "The monkey got %d peach in first day.",y );
if( y!=1 )printf("The monkey got %d peachs in first day.",y);
}
结果:
输入:3
输出:The monkey got 14 peachs in first day.
8 求最后3位数值
中学时我们就会求一个数的 n 次方了,但计算机不会,请你来编写一个程序吧。
由于计算机比较“笨”,所以我们编写程序的功能不用太强,只要能算出 a 的 n 次方的最后 3 位数就可以了。
输入:和 n 的值。
假设 a<=150 。
输出:求 a 的 n 次方的最后 3 位数。
程序实例1:
#include<>
void main()
{
int i,x,y,m=1;
scanf("%d %d",&x,&y);
for(i=1;i<=y;i++)
m=m*x%1000;
if(m==0)
printf("The last 3 numbers is 000.\n");
else
printf("The last 3 numbers is %d.\n",m);
}
结果:
输入:10 0
输出:The last 3 numbers is 1.
程序实例2:
#include<>
void main()
{int a,n,i,s;
scanf("%d%d",&a,&n);
i=1; s=1;
while(i<=n)
{s=s*a%1000;
i++;}
if(n!=0) {printf("The last 3 numbers is %.\n",s); }
else {printf("The last 3 numbers is %d.\n",s); }
}
结果:
输入:100 10
输出:The last 3 numbers is 000.
9 分数的四则运算
在小学时我们就学习了分数的四则运算,即对两个分数进行加、减、乘、除等运算,现在我们尝试下用C语言来实现。
输入:分数1 操作符分数2
输出:计算结果
要求:
计算结果使用分数表示,并且为最简化。
例如结果为2/6,则被简化为1/3程序实例1:
#include<>
int main()
{
int a,b,c,d,e,f,x,y,z;
char g;
scanf("%d/%d %c %d/%d",&a,&b,&g,&c,&d);
if(g=='+') { e=a*d+b*c;f=b*d; }
if(g=='-') { e=a*d-b*c;f=b*d; }
if(g=='*') { e=a*c;f=b*d; }
if(g=='/') { e=a*d;f=b*c; }
x=e; y=f; z=x%y;
if(z!=0)
{
while(z!=0)
{ x=y;y=z;z=x%y; }
e=e/y; f=f/y;
if(f>0) printf("%d/%d %c %d/%d = %d/%d",a,b,g,c,d,e,f); if(f<0) printf("%d/%d %c %d/%d = %d/%d",a,b,g,c,d,-e,-f); }
else { printf("%d/%d %c %d/%d = %d",a,b,g,c,d,e/f); } printf("\n");
return 0;
}
结果:
输入:1/3 + 1/2
输出:1/3 + 1/2 = 5/6
程序实例2:
#include""
#include<>
void main()
{
int a,b,c,d,m,n,x,y,v;char z;
scanf("%d/%d %c %d/%d",&a,&b,&z,&c,&d);
switch (z)
{ case('+'):m=a*d+b*c;n=b*d;break;
case('-'):m=a*d-b*c;n=b*d;break;
case('*'):m=a*c;n=b*d;break;
case('/'):m=a*d;n=b*c;break;
}
x=fabs(m);y=fabs(n);v=x%y;
while(v!=0)
{x=y;y=v;v=x%y;}
if(m/y==0) printf("%d/%d %c %d/%d = 0\n",a,b,z,c,d);
else if(n/y==1) printf("%d/%d %c %d/%d = %d\n",a,b,z,c,d,m/y); else printf("%d/%d %c %d/%d = %d/%d\n",a,b,z,c,d,m/y,n/y); }
结果:
输入:1/2+2/6
输出:1/2+2/6=5/6
10 黑色星期五
在西方,星期五和数字13都代表着坏运气,两个不幸的个体最后结合成超级不幸的一天。
所以,不管哪个月的十三日又恰逢星期五就叫“黑色星期五”。
输入:年份
输出:判断该年是否包含黑色星期五,如包含,给出具体日期
程序实例1:
#include ""
void main()
{
int year,month,day,i,k=0,ruinian,n;
int a[12]={6,2,2,5,0,3,5,1,4,6,2,4};
int b[12]={6,2,3,6,1,4,6,2,5,0,3,5},c[12]={0};
scanf ("%d",&year);
n=((year%400)*365+(year%400+3)/4-(year%400)/100+5)%7;
ruinian=(year%4==0 && year%100!=0 || year%400==0);
for (i=0;i<12;i++)
if ((((ruinian==1)b[i]:a[i])+n)%7==5)
{
c[i]=1;
k++;
}
printf ("There %s %d Black %s in year %d.\n%s:\n",(k==1)"is":"are",k,(k==1)"Friday":"Fridays",year,(k==1)"It is":"They are");
for (i=0;i<12;i++)
if (c[i]==1)
printf ("%d/%d/13\n",year,i+1);
}
结果:
输入:2006
输出:
There are 2 Black Fridays in year 2006.
They are:
2006/1/13
2006/10/13
程序实例2:
#include""
void main()
{ int m,y,k=0,i,w,a[6];
scanf("%d",&y);
for(m=1;m<=2;m++)
{ w=(13+2*(m+12)+3*(m+13)/5+y-1+(y-1)/4-(y-1)/100+(y-1)/400)%7;
if(w==4)
{ a[k]=m;k++;} }
for(m=3;m<13;m++)
{ w=(13+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
if(w==4)
{a[k]=m;k++;} }
if(k==1) { printf("There is 1 Black Friday in year %d.\nIt is:\n%d/%d/13\n",y,y,a[0]);} else {printf("There are %d Black Fridays in year %d.\n",k,y);
printf("They are:\n");
for(i=0;i<k;i++)
printf("%d/%d/13\n",y,a[i]);}
}
结果:
输入:2007
输出:
There are 2 Black Fridays in year 2007
They are:
2007/4/13
2007/7/13
11 百马百担
有100匹马,驮100担货,其中大马驮3担,中马驮2担,两匹小马驮1担输入:无
输出:大、中、小马的个数,用逗号分隔。
例如:2,30,68
说明:大、中、小马都必须有,结果中要列出所有的组合可能每个结果占一行因为有多个结果,结果的排序按照大马的个数从少到多
程序实例1:
#include <>
void main()
{
int bigHorse,middleHorse,smallHorse;
bigHorse=0;
while(bigHorse<=33)
{
middleHorse=1;
while(middleHorse<50)
{
smallHorse=100-bigHorse-middleHorse;
if(3*bigHorse+2*middleHorse+smallHorse/2==100&&smallHorse%2==0) printf("%d,%d,%d\n",bigHorse,middleHorse,smallHorse);
middleHorse++;
}
bigHorse++;
}
}
结果:
输入:无
输出:
2,30,68
5,25,70
8,20,72
11,15,74
14,10,76
17,5,78
程序实例2
#include<>
void main()
{
int a,b,c;
for(a=0;a<=33;a++)
{
for(b=1;b<50;b++)
{
c=100-a-b;
if(3*a+2*b+c/2==100&&c%2==0)
printf("%d,%d,%d\n",a,b,c);
}
}
}
结果:
输入:无
输出:
2,30,68
5,25,70
8,20,72
11,15,74
14,10,76
17,5,78
12 零钱换整钱
小明去银行存钱,拿了一堆硬币。
已知 1 角的硬币厚度为, 5 角的硬币厚, 1 元的硬币为。
小明将 1 角的硬币放成一摞,将 5 角的硬币硬币放成一摞,将 1 元的硬币放成一摞,发现 3 摞硬币一样高。
银行正好把这些硬币换成若干张面值为 10 元的纸币。
问小明至少带了多少钱的硬币(元为单位),每种面值的硬币有多少个
输入:无
输出:1 角的数量,5 角的数量,1元的数量,总金额。
(例如:20,30,40,50)
说明:在结果中只输出各个对应的数字即可
程序实例1:
#include <>
int yue(int a,int b)
{
int t;
t=a%b;
while(t)
{a=b,b=t,t=a%b;}
return b;
}
int main(void)
{int x,y,z;
x=18*15/yue(18,15);
x=x*20/yue(x,20);
z=y=x/18+x*5/15+x/2;
while(z%100)
{z+=y;}
printf("%d,%d,%d,%d\n",z/y*x/18,z/y*x/15,z/y*x/20,z/10); return 0;
}
结果:
输入:无
输出:50,60,45,80
程序实例2:
#include<>
int main()
{int i,j,k,a;
for(i=10;;i+=10)
{j=6*i/5;k=9*i/10;a=*i+*j+*k;
if(a%10==0) {printf("%d,%d,%d,%d\n",i,j,k,a);break;} }
return 0;}
结果:
输入:无
输出: 50,60,45,80
13 找出最大素数
素数是指一个只能被1和它本身整除的数,在数论中占有重要的研究地位,在当代密码学中也被广泛应用。
输入:
取值范围
输出:
该范围内的最大素数
程序实例1
#include <>
#include <>
int judgeis(int a)
{
int i;
for(i=2;i<sqrt(a);i++)
{if (a%i==0) {return 0;}}
return 1;
}
int main()
{
int n;
scanf("%d",&n);
while(judgeis(n)==0){n--;}
printf("The max prime number is %d.",n); return 0;
}
结果:
输入:100
输出:The max prime number is 97.
程序实例2:
#include<>
#include<>
int IsPrime(int n) {
int i;
for(i=2;i<=sqrt(n);i++)
if(n%i==0) return(0);
return(1);
}
void main() {
int n;
scanf("%d",&n);
for(;;n--) if(IsPrime(n)) break;
printf("The max prime number is %d.\n",n); }
结果:
输入:5555
输出:The max prime number is 5531.
14 空心的倒三角型
背景:
请根据要求打印可空心倒三角形。
输入:
输入三角形的高度(h >= 0)。
输出:
打印相应的空心倒三角形。
图样参见测试用例。
程序实例1:
#include <>
int main(void)
{
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{for(j=0;j<(2*n-1-i);j++)
{if (i==0||i==j||j==(-i+2*n-2))printf("*"); else printf(" ");
}
printf("\n");
}
return 0;
}
结果:
输入:3
输出:
*****
* *
*
程序实例2:
#include ""
void main()
{int r,l,h;
scanf("%d",&h);
for(r=1;r<=2*h-1;r++) printf("*");
for(r=2;r<=h;r++)
{printf("\n"); for(l=1;l<=2*h-r;l++) printf("%s",(l==r||l==2*h-r)"*":" ");} }
结果:
输入:5
输出:
*********
* *
* *
* *
*
15 空心字符菱形
输入:菱型起始字母和菱形的高度。
输出:参看测试用例,打印空心的由字符组成的菱形。
程序实例1:
#include ""
#include ""
void main()
{ char c;int n,i,j;
scanf("%c%d",&c,&n);
for(c=c+n-1,i=1-n;i<=n-1;i++)
{for(j=1;j<=2*n-1-abs(i);j++)
if(j==abs(i)+1||j==2*n-1-abs(i)) printf("%c",c-abs(i)); else printf(" ");
printf("\n");
}
}
结果:
输入:C 4
输出:
C
D D
E E
F F
E E
D D
C
程序实例2:
#include""
int main()
{
int i,j,h;char e;
scanf("%c %d",&e,&h);
for(i=1;i<=h;i++)
{for(j=1;j<=h+i-1;j++)
{if(j==h-i+1||j==h+i-1)printf("%c",e+i-1);
else printf(" "); }
printf("\n");
}
for(i=h+1;i<=2*h-1;i++)
{ for(j=1;j<=3*h-i-1;j++)
{if(j==i-h+1||j==3*h-i-1) printf("%c",e+2*h-i-1);
else printf(" ");}
printf("\n");
}
return 0;
}
结果:
输入:S 3
输出:
S
T T
U U
T T
S
16 邮票组合(选作)
背景:我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小面值邮票中的一张或几张的组合,可以满足不同邮件的不同的邮资。
现在,邮局有4种不同面值的邮票。
在每个信封上最多能贴5张邮票,面值可相同,可不同。
输入:四种邮票的面值。
输出:用这四种面值组成的邮资最大的从1开始的一个连续的区间。
说明:如结果为10,则表明使用4张邮票可组合出1、2、3、4、5、6、7、8、9、10这些邮资。
名词解释:
邮资:就是你寄东西需要花多少钱。
邮票面额:是由国家发行的具有固定价格的花纸片,被称为邮票。
如果你寄东西,邮局称了重量,告诉你要240分。
这样你就要贴邮票了。
如果现在邮局的邮票有面值为80分、50分、20分和10分的四种,你就可以采用不同的组合得到240的邮资,例如:采用3张80分的可以凑出240分;或者24张10分的凑起来240分也可以。
显然不同邮票的组合都可以得到同样一种邮资。
程序实例1:
/*This program is to find the max set*/
#include<>
main()
{
int a,b,c,d,i,j,k,l;
static int s[1000];
scanf("%d%d%d%d",&a,&b,&c,&d);
for (i=0;i<=5;i++)
for (j=0;i+j<=5;j++)
for (k=0;k+i+j<=5;k++)
for (l=0;k+i+j+l<=5;l++)
if (a*i+b*j+c*k+d*l) s[a*i+b*j+c*k+d*l]++;
for (i=1;i<=1000;i++)
if(!s[i]) break;
printf("The max is %d.\n",--i);
return 0;
}
结果:
输入:1 4 12 21
输出:The max is 71.
程序实例2:
#include ""
int total,max;
int value[5],num[1000] = { 0 };
void findmax(int n,int p)
{ int i;
if (p < 5 )
for (i = n;i <= 4;i ++)
{ total += value[i];
if (max < total) max = total; num[total] = 1;
findmax(i,p + 1);
total -= value[i];
}
}
int main()
{ int i;
for (i = 1;i <= 4;i ++)
scanf("%d",&value[i]);
total = 0;max = 0;
findmax(1,0);
for (i = 1;i <= max;i ++)
if (!num[i]) break;
printf("The max is %d.\n",i - 1);
return 0;
}
结果:
输入:1 3 7 12
输出:The max is 46.
17 谁能出线
背景:
电视台举办“超级学生”才艺大赛,由于报名人数狂多,所以要先进行分组预赛。
按规定,每10名学生为一个预赛小组,评委打出分数(0~100分),各小组第一名可以进入下一轮;如果有多名学生得分相同都是第一名,则可同时进入下一轮。
输入:按顺序给出一个小组10个人的最后得分(int)。
输出:能够出线的学生序号(0~9)。
程序实例1:
#include""
main()
int i,maxa[10]={0},num,max=0,a[10];
for(i=0;i<10;i++)
scanf("%d",&a[i]);/*输入*/
for(i=0;i<10;i++)
{
if(a[i]>max)/*如果大于最大值*/
{
max=a[i];/*保存最大值*/
num=1;/*个数*/
maxa[0]=i;/*保存下标*/
}
else if(a[i]==max)/*如果等于最大值*/
{
maxa[num]=i;/*保存下标*/
num++;
}
}
for(i=0;i<num;i++)/*输出*/
printf("%d\n",maxa[i]);
}
结果:
输入:
98
98
100
97
94
90
94
93
92
输出:2
程序实例2;
#include <>
void main()
{ int i,a[10],m=0;
for(i=0;i<10;i++) {
scanf("%d",&a[i]);
if(a[i]>m) m=a[i];
}
for(i=0;i<10;i++) {
if(a[i]==m) {
printf("%d\n",i); }
}
}
结果:
输入:
99
98
99
95
99
90
94
93
100
输出:9
18 等值数列段(06秋)
如果一个数列中的某一段(至少有两个元素)的各元素值均相同,则称之为等值数列段。
等值数列段中元素的个数叫做等值数列段的长度。
输入:由N个元素组成的整数数列A(其中N<=50)
输出:A中长度最大的所有等值数列段的始末位置,如果没有等值数列段,则输出No equal number list.
说明:
始末位置是指数组下标,即0表示第一个元素。
如果有多个同等长度的等值数列,只输出第一个等值数列的起始位置。
当在一个LIST中出现两个等长的连续串的时候,我们的答案应该是第一个等长串。
程序实例1:
#include""
main()
{
int i=0,j=0,k,n,max=0,maxnum=0,a[50];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);/*输入*/
for(i=j;i<n;i++)/*循环遍历*/
{
j=i+1;
if(a[i]==a[j])/*如果相临的相等,i不变,继续看相等字符有多长*/
{
while(a[i]==a[++j]);/*循环直到不相等为止*/
if(maxnum<j-i)/*判断是否为最长*/
{
maxnum=j-i;/*保存长度*/
max=i;/*保存起始位置*/
}
}
}
if(maxnum>0)/*输出*/
printf("The longest equal number list is from %d to %d.\n",max,maxnum+max-1);
else
printf("No equal number list.\n");
}
结果:
输入:
5
1 2 3 4 5
输出:No equal number list.
程序实例2:
#include""
void main()
{
int a,x[50],i,j,m=0,n=0;
scanf("%d",&a);
for(i=0;i<a;i++)
scanf("%d",&x[i]);
for(i=0;i<a-1;i=j)
{j=i+1;
while(x[j]==x[i]&&j<a) j++;
if(j-i-1>n-m) {m=i;n=j-1;}
}
if((n-m)==0) printf("No equal number list.\n");
else printf("The longest equal number list is from %d to %d.\n",m,n);
}
输入:
结果:
6
1 0 1 1 1 0
输出:The longest equal number list is from 2 to 4.
19 大家一起做游戏(06秋)
幼儿园的小朋友们刚学习了如何数数,阿姨在下课时组织大家一起玩游戏。
规则如下:所有的小朋友绕成一圈,顺序排号,从第一个小朋友开始报数,凡是报到固定数字(例如5)的,都退出该游戏,直到只剩下一位小朋友游戏才中止。
每个小朋友都希望自己能有更多的练习数数的机会,所以都希望成为最终被留下的那位。
现在,请大家帮小朋友们计算一下,在第一次排号的时候排到第几位才能成为最终被留下的小朋友。
输入:小朋友的个数(<=50)要被练习的数字
输出:最终被留下的小朋友的序号
说明:如“要被练习的数字”是5,则每次数到5的同学要退出该游戏
程序实例1:
#include""
main()
{
int m,n,d,i,temp,a[100];
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
a[i]=i+1;
temp=0;
d=0;
while(d<n-1)/*标志次数,n-1次后结束,这是将只剩一个小孩*/ for(i=0;i<n;i++)
if(a[i]!=0)/*小朋友还没退出游戏*/
{
temp++; /*小朋友报数的数字*/
if(temp==m) /*小朋友这次该退出游戏*/
{
a[i]=0; /*在数组中表示出来*/
temp=0; /*报数从新开始*/
d++; /*退出人数加1*/
}
}
for(i=0;i<n;i++)/*输出,寻找最后一个退出的小朋友*/ if(a[i]!=0)
printf("The left child is NO %d.\n",a[i]); }
结果:
输入10 3:
输出:The left child is NO 4.
程序实例2:
#include<>
void main()
{
int a[51],i,j,x,n;
scanf("%d %d",&n,&j);
for ( i=0;i<=n-2;i++) a[i]=i+1;a[n-1]=0;x=n-1; while( a[x]!=x )
{ for( i=1;i<=j-1;i++)
x=a[x];
a[x] = a[a[x]];
}
printf( "The left child is NO %d.",x+1 );
}
结果:
输入:50 15
输出:The left child is NO 22.
20 猜数字(选作)
有如下一组数字,其中每个数字都在 1 ~ 63 之间,
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63
2 3 6 7 10 11 14 15 18 19 22 23 26 27 30 31 34 35 38 39 42 43 46 47 50 51 54 55 58 59 62 63
4 5 6 7 12 13 14 15 20 21 22 23 28 29 30 31 36 37 38 39 44 45 46 47 52 53 54 55 60 61 62 63
8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31 40 41 42 43 44 45 46 47 56 57 58 59 60 61 62 63
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
现在需要编写一个程序,当从键盘输入某数字在且仅在哪几行出现了,该程序可以“猜”出这个数字是几。
输入:程序的输入是一串以空白符分开的数字,当输入 0 时表示输入结束。
输出:输出猜到的数字。
程序实例1:
#include <>
main()
{
int i,re;
re = 0 ;
scanf("%d",&i);
while ( i ) {
re += 1 << (i-1); scanf("%d",&i); }
printf("%d\n",re);
}
结果:
输入:1 2 0
输出:3
程序实例2:
#include<>
#include<>
int main()
{ int a[7],i=0,x=0;
scanf("%d",&a[i]);
while(a[i])
{i++;
scanf("%d",&a[i]);
}
for(i=0;a[i];i++)
x=x+pow(2,a[i]-1);
printf("%d",x);
return 0;
}
结果:
输入:3 4 5 6 0
输出:60
21 小蜜蜂(选作)
一只小蜜蜂在如下图所示的蜂窝上爬行。
它爬行时,只能从一个格爬到相邻的大号格子中。
例如,从 1 号格子可以爬到 2 号或者 3 号格子,从 2 号则可以爬到 3 号或者 4 号格子。
请问从一个格子 a 爬到一个格子 b 一共有多少种可行的路线。
输入:分别是起始点 a 和终止点 b 的编号。
( a 和 b 在 1~100 之间,且 a<b 。
)
输出:方案数量。
程序实例1:
#include ""
void main()
{ int a,b,i;
double a1,a2,t;
scanf("%d%d",&a,&b);
a1=1;a2=1;
for(i=1;i<=b-a;i++)
{t=a2;
a2=a1+t;
a1=t;
}
printf("%.0lf",a1);
}
结果:
输入:1 4
输出:3
程序实例2:
#include ""
#include ""
int main()
{
int a,b,i,t;
double n=0,x=1,y=1;
scanf("%d %d",&a,&b);
t=b+1-a;
for(i=1;i<=t;i++)
x*=(1+sqrt(5))/2,y*=(1-sqrt(5))/2;
printf("%.0lf\n",(x-y)/sqrt(5));
return 0;
}
结果:
输入:2 50
输出:49
22 数制转换(选作)
我们通常使用的都是十进制的数字,但其实在生活中也经常会使用其它进制。
这个题目会给你两个不同的数字,它们不属于同一进制,要求你计算出当它们分别处于何种进制之中时,两个数字相等。
譬如 12 和 5 ,在十进制下它们是不等的,但若 12 使用 3 进制而 5 使用六进制或十进制时,它们的值就是相等的。
因此只要选择合适的进制, 12 和 5 就可以是相等的。
程序的输入是两个数字 M 和 N( 其十进制的值不超过 00) ,它们的进制在 2~36 之间。
对于十以下的数字,用 0~9 表示,而十以上的数字,则使用大写的 A~Z 表示。
求出分别在 2~36 哪种进制下 M 和 N 相等。
若相等则输出相应的进制,若不等则输出错误信息。
信息的格式见测试用例。
程序实例1:
#include <>
#include <>
#include <>
int zhi(char c)
{
if ( c >= 'A' )
return c-'A'+10;
else
return c-'0';
}
int minjinzhi(char *s)
{
int max,cur;
max = 0;
while ( *s ) {
cur = zhi(*s);
if ( cur > max )。