您的位置:首页 > 其它

暑假训练(一) 通过的题目

2013-07-13 11:58 211 查看
1190 Problem A:乘法口诀

Description
还记得以前小学时的九九乘法口诀吧。现在要求你编写程序打印出乘法口诀。

不过现在的乘法口诀表跟以前稍微有点区别,我告诉你一个数字n( 1 <= n <= 9),你要给我打出相应的nn乘法口诀表。
Input
多个测试数据。每个测试数据一行,输入整数n.
Output
输出nn乘法口诀表。

每个乘法口诀表中的任何一个乘式占6列,不足6列的在后面补空格。同一行2个乘式之间有一个空格。

两个乘法口诀表之间有一个空行。
Sample Input

1
2
6


Sample Output

1*1=1

1*1=1
1*2=2  2*2=4

1*1=1
1*2=2  2*2=4
1*3=3  2*3=6  3*3=9
1*4=4  2*4=8  3*4=12 4*4=16
1*5=5  2*5=10 3*5=15 4*5=20 5*5=25
1*6=6  2*6=12 3*6=18 4*6=24 5*6=30 6*6=36


Hint
%2d表示是按照整数格式输出,中间的2表示数字不足2位则补齐两位,不足位置用空格补,默认右对齐。

%-2d表示数字的对齐方式为左对齐

一:源代码
#include<stdio.h>

#include<string.h>

int main()

{

int i,j,n;

char a[10][10];

while(scanf("%d",&n)!=EOF)

{

for(i=1;i<=n;i++)

{

for(j=1;j<=i;j++)

{

a[i][j]=i*j;

printf("%d*%d=%-2d ",j,i,a[i][j]);

}

printf("\n");

}

printf("\n");

}

return 0;

}

二:结果截图



三:思路和感受
这个题目上学期就做过的,主要是运用双重循环。

1191 Problem B:人见人爱A^B

Description
求A^B的最后三位数表示的整数。

说明:A^B的含义是“A的B次方”
Input
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。
Output
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。
Sample Input

2 3
12 6
6789 10000
0 0


Sample Output

8
984
1


一:源代码
#include<stdio.h>

#include<string.h>

int main()

{

int a,b,i,s;

while(scanf("%d%d",&a,&b)!=EOF)

{

s=1;

if(a==0&&b==0)

break;

for(i=0;i<b;i++)

{

s=a*s;

if(s>=1000)

s=s%1000;

}

printf("%d\n",s);

}

return 0;

}

二:结果截图



三:思路和感受
首先是if(a==0&&b==0)break; 这个是符合条件输入0就结束的。
之后保留后三位,开始是先乘了之后我再来进行的保留,即
for(i=0;i<b;i++) {s=a*s;}
if(s>=1000) s=s%1000;
后来发现乘法之后太大了,溢出,根本就不能运算,之后就改成了乘一次就对后三位的整数保留,即
for(i=0;i<b;i++)

{

s=a*s;

if(s>=1000)

s=s%1000;

}
这样就不会溢出了,然后就通过了。

1192 Problem C:8 984 阶乘和

Description
求阶乘和
Input
多组测试数据。每组一行,输入一个整数n, 1 <= n <= 10
Output
每组数据输出一行,计算1!+2!+...+n!的和
Sample Input

1
3


Sample Output

1
9


一:源代码
#include<stdio.h>

int add(int m)

{

int j,s=1;

for(j=1;j<=m;j++)

s=s*j;

return s;

}

int main()

{

int n,i,q;

while(scanf("%d",&n)!=EOF)

{

q=0;

for(i=1;i<=n;i++)

{

q=q+add(i);

}

printf("%d\n",q);

}

return 0;

}

二:结果截图



三:思路和感受
这个题目第一次写的时候用了一个函数,求阶乘,然后再进行的求和,符合题目要求。
这个题目也算是一个小模板,以后求狠么复杂的求和都可以用。
当然,直接用一个主函数也可以,把循环写在程序里面就可以了。

1193 Problem D:打印金字塔

Description
请编写程序输出金字塔图形。
Input
多个测试数据。每个测试数据输入一个整数n(1 <= n <= 9)
Output
输出n层金字塔。
Sample Input

1
3


Sample Output

*
*
***
*****


Hint
用双重循环做,外循环代表行数,第一个内循环输出空格,第二个内循环输出*

for(;;)

{

for(;;)

{

}//输出空格

for(;;)

{

}//输出*

}//外循环

一:源代码
#include<stdio.h>

int main()

{

int i,j,q,n;

while(scanf("%d",&n)!=EOF)

{

if(n>=1&&n<=9)

{

for(i=1;i<=n;i++)

{

for(j=0;j<n-i;j++)

{

printf(" ");

}

for(q=0;q<(2*i-1);q++)

{

printf("*");

}

printf("\n");

}

}

}

return 0;

}

二:结果截图



三:思路和感受
这个就是用双重循环做,外循环代表行数,第一个内循环输出空格,第二个内循环输出* 。

第一个内循环就是 for(j=0;j<n-i;j++) {printf(" ");} ,输出空格。
第二个内循环就是 for(q=0;q<(2*i-1);q++){printf("*");}输出字符星号。
找规律就可以了。

1195 Problem F:平方和与立方和

Description
给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。
Input
输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成。
Output
对于每组输入数据,输出一行,应包括两个整数x和y,分别表示该段连续的整数中所有偶数的平方和以及所有奇数的立方和。

你可以认为32位整数足以保存结果。
Sample Input

3 1
2 5


Sample Output

4 28
20 152


一:源代码
#include<stdio.h>

int main()

{

int m,n,s,i,t,q;

while(scanf("%d%d",&m,&n)!=EOF)

{

s=0,q=0;

if(m>n)

{

t=m;m=n;n=t;

}

for(i=m;i<=n;i++)

{

if(i%2==0)

s=s+i*i;

else

q=q+i*i*i;

}

printf("%d %d\n",s,q);

}

return 0;

}

二:结果截图

三:思路和感受
这个题目以前做过,之前做的时候开始没明白什么意思,后来才弄懂,是在从第一个数到第二个数的区间里面的奇数和偶数,当然要先比较大小才能循环运算。

1199 Problem J:求圆柱体的表面积

Description

Input
输入底面半径r和高h
Output
输出圆柱体的表面积,保留3位小数
Sample Input

3.5 9


Sample Output

Area=274.889


Hint
注意:pi的计算为:const double pi=4.0 * atan(1.0);

或者直接赋值pi = 3.1415926

一:源代码
#include<stdio.h>

#include<math.h>

#define PI acos(-1)

int main()

{

float r,h,s;

scanf("%f%f",&r,&h);

s=PI*r*r*2+2*PI*r*h;

printf("Area=%.3lf\n",s);

return 0;

}

二:结果截图

三:思路和感受
就是运用公式求圆柱体表面积。不过开始的时候定义为double 了,结果不正确,后来改为float就好了。

1120 Problem K:判断是否直角三角形

Description
输入角形的三条边,判断是否是直角三角形
Input
输入三角形3条边(均为整数)
Output
如果3条边组成的是直角三角形,输出yes否则输出no
Sample Input

3 4 5


Sample Output

yes


一:源代码
#include<stdio.h>

int main()

{

int a,b,c;

scanf("%d%d%d",&a,&b,&c);

if((a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a))

printf("yes\n");

else

printf("no\n");

return 0;

}

二:结果截图







三:思路和感受
这个题目有考虑到三边长度的问题,但是开始说用比较,也没想到一个好的方法,后来就直接用判断算了,最简单。

1203 Problem N:多组测试数据(a+b)

Description
计算a+b.很多的题目测试数据会有很多组的,一般我们的在线系统没写具体要求的时候,输入是以EOF为结束的。这题的基本框架如下:

int main()

{

int a,b;

while(scanf("%d%d",&a,&b)!=EOF) //特别注意这行的写法

{

...//求和

...//输出

}

}

scanf函数是有返回值的,如果从键盘上成功读入一个数,那么返回值就是1,如果成功读入2个,则返回2。如果处理到文件末尾,则返回EOF

特别注意:题目的要求实际上是指每组数据输入结束后,马上输出这组的结果,而不是等所有数据输完后才输出结果
Input
输入为多组测试数据。每组一行,每行输入2个整数a和b
Output
对于每组测试数据,输出一行,输出a+b的值,直到文件末尾

Sample Input

2 3
4 5
7 8


Sample Output

5
9
15


一:源代码
#include<stdio.h>

int main()

{

int a,b;

while(scanf("%d%d",&a,&b)!=EOF)

{

printf("%d\n",a+b);

}

return 0;

}

二:结果截图



1204 Problem O:多组测试数据(a+b)II

Description
同样是计算a+b

同样是多组测试数据,但有的题目要求先输入一个整数n表示测试数据个数,然后是n组测试数据。对于这类题目大家可以采用下面的形式,不需要再用EOF:

int main()

{

int n;

int i,a;

scanf("%d",&n);//输入测试数据组数

for(i=1;i<=n;i++)//循环n次

{

....//这里是每组数据的内容,包括输入、处理、输出

}

}
Input
第一行输入1个整数n,表示测试组数

然后是n行,每行2个整数a和b,中间用空格隔开
Output
对于每组测试数据,要求输出一行,分别是a+b的值
Sample Input

2
1 2
3 4


Sample Output

3
7


一:源代码
#include<stdio.h>

int main()

{

int n,i,a,b;

scanf("%d",&n);

for(i=1;i<=n;i++)

{

scanf("%d%d",&a,&b);

printf("%d\n",a+b);

}

return 0;

}

二:结果截图



1201 Problem L:求多项式

Description
形如1-2+3-4...+n,你会编写吗?
Input
输入1个正整数n
Output
输出1-2+3-4...+n的值

Sample Input

3


Sample Output

2


一:源代码
#include<stdio.h>

int main()

{

int n,i,s;

s=0;

scanf("%d",&n);

for(i=1;i<=n;i++)

{

if(i%2==0)s=s-i;

else

s=s+i;

}

printf("%d\n",s);

return 0;

}

二:结果截图



三:思路和感受
if(i%2==0)s=s-i;只要这样就可以表示负号了,但是用公式也是可以的。

1202 Problem M:继续求多项式

Description
输入1个正整数n,

计算1+(1+2)+(1+2+3)+...+(1+2+3+...+n)
Input
输入正整数n
Output
输出1+(1+2)+(1+2+3)+...+(1+2+3+...+n)的值
Sample Input

2


Sample Output

4


一:源代码
#include<stdio.h>

int add(int m)

{

int j,s=0;

for(j=1;j<=m;j++)

s=s+j;

return s;

}

int main()

{

int n,i,q;

while(scanf("%d",&n)!=EOF)

{

q=0;

for(i=1;i<=n;i++)

{

q=q+add(i);

}

printf("%d\n",q);

}

return 0;

}

二:结果截图



三:思路和感受
这个题目就是用的上面一题的求阶乘的模板,一模一样,就是把函数小小的改动了一下。

1196 Problem G:计算直线的交点数

Description
平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。

比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
Input
输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n <= 20),n表示直线的数量.
Output
每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。
Sample Input

2
3


Sample Output

0 1
0 2 3


一:源代码
#include<stdio.h>

#include<string.h>

const int MAXN=1000;

int main()

{

int n,i,j,k;

int line[30][MAXN];

memset(line[1], 0, sizeof(line[1]));

line[1][0]=1;

for (i=2; i<=20; i++)

{

memset(line[i], 0, sizeof(line[i]));

line[i][0]=1;

for (j=1; j<i; j++)

{

for (k=0; k<MAXN; k++)

{

if (line[j][k]==1)

{

line[i][(i-j)*j+k]=1;

}

}

}

}

while (scanf("%d", &n)!=EOF)

{

for (i=0; i<MAXN; i++)

{

if (i==0) printf("0");

else if(line
[i]==1) printf(" %d", i);

}

printf("\n");

}

return 0;

}

二:结果截图



三:思路和感受
这个题目算是有点难度的了,有简单请教了一下他们的。

将n 条直线排成一个序列,直线2和直线1最多只有一个交点,直线3和直线1,2最多有两个交点,.....,直线n 和其他n-1条直线最多有n-1个交点。由此得出n条直线互不平行且无三线共点的最多交数: Max = 1 +2 +......+(n-1)=n(n-1)/2。

容易列举出i=1,2,3的情况如下图所示,来分析n=4的情况:
1. 四条直线全部平行,无交点
2. 其中三条平行,交点数: (n-1)*1 +0=3;
3. 其中两条平行,而另外两条直线的交点既可能平行也可能相交,因此交点数据分别为: (n-2)*2+0=4 (n-2)*2 +1=5
4. 四条直线互不平行, 交点数为(n-3)*3+3条直线的相交情况:
(n-3)*3+0=3 (n-3)*3+2=5 (n-3)*3+3=6
即n=4时,有0, 3, 4, 5, 6个不同的交点数.所有有5种可能 从上述n=4的分析过程中,发现:
M条直线的交点方案数=(m-r)条平行线与r条直线交叉的交点数+r条直线本身的交点方案=(m-r)*r +r条直线之间的交点数。 即可完成。

1194 Problem E:年龄问题

Description
有n个人坐在一起,问第n个人多少岁?他说比第n-1个人大m岁。问第n-1个人岁数,他说比第n-2个人大m岁。问第n-2个人,又说比第n-3人大m岁。......最后问第一个人,他说是K岁。请问第n个人多大? (可递归函数实现)
Input
多组测试数据 每组一行 分别输入3个整数 n, m 和k
Output
输出第n个人的岁数
Sample Input

5 2 10


Sample Output

18


一:源代码

#include<stdio.h>
int main()
{
int n,m,k;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{

printf("%d\n",(n-1)*m+k);
}
return 0;
}


二:结果截图



三:思路和感受
这个题目我直接用递推算出来的公式直接做的。

请教啊,这个题目用递归函数怎么做????????
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: