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


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
#include
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;
}


二:结果截图

暑假训练(一) 通过的题目_第1张图片



三:思路和感受

这个题目上学期就做过的,主要是运用双重循环。





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
#include
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  {
  s=a*s;
  if(s>=1000)
     s=s%1000;
  }
  printf("%d\n",s);


}
return 0;
}



二:结果截图

暑假训练(一) 通过的题目_第2张图片


三:思路和感受

    首先是if(a==0&&b==0)break; 这个是符合条件输入0就结束的。

    之后保留后三位,开始是先乘了之后我再来进行的保留,即 

    for(i=0;i {s=a*s;}

        if(s>=1000)   s=s%1000;

后来发现乘法之后太大了,溢出,根本就不能运算,之后就改成了乘一次就对后三位的整数保留,即 

        for(i=0;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
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;
}



二:结果截图

暑假训练(一) 通过的题目_第3张图片


   


三:思路和感受

   这个题目第一次写的时候用了一个函数,求阶乘,然后再进行的求和,符合题目要求。

    这个题目也算是一个小模板,以后求狠么复杂的求和都可以用。

   当然,直接用一个主函数也可以,把循环写在程序里面就可以了。





1193  Problem D:打印金字塔


Description

请编写程序输出金字塔图形。

Input

多个测试数据。每个测试数据输入一个整数n(1 <= n <= 9)

Output

输出n层金字塔。

Sample Input

1
3

Sample Output

*
  *
 ***
*****

Hint

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


for(;;) 


}//输出空格 

for(;;) 


}//输出* 


}//外循环



一:源代码

#include
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             {
printf(" ");
}
for(q=0;q<(2*i-1);q++)
{


printf("*");
}
printf("\n");
}
}
}
return 0;
}


二:结果截图

暑假训练(一) 通过的题目_第4张图片



三:思路和感受

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

         第一个内循环就是 for(j=0;j

                第二个内循环就是 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
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
#include
#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
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;
}



二:结果截图

暑假训练(一) 通过的题目_第5张图片



三:思路和感受

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





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
int main()
{
int a,b; 
   while(scanf("%d%d",&a,&b)!=EOF) 
   { 
      printf("%d\n",a+b);


   }  
   return 0;
}



二:结果截图


暑假训练(一) 通过的题目_第6张图片






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
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;
}



二:结果截图

暑假训练(一) 通过的题目_第7张图片







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
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;
}




二:结果截图

暑假训练(一) 通过的题目_第8张图片



三:思路和感受

    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
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;
}



二:结果截图

暑假训练(一) 通过的题目_第9张图片




三:思路和感受

   这个题目就是用的上面一题的求阶乘的模板,一模一样,就是把函数小小的改动了一下。





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
#include  
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         { 
            for (k=0; k
                if (line[j][k]==1)              

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

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

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

        printf("\n");     

    return 0; 
}




二:结果截图

暑假训练(一) 通过的题目_第10张图片



三:思路和感受

    这个题目算是有点难度的了,有简单请教了一下他们的。

   

    将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
int main()
{
	 int n,m,k;	 
  while(scanf("%d%d%d",&n,&m,&k)!=EOF)
  {
	  
    printf("%d\n",(n-1)*m+k);
  }
  return 0;
}

 


二:结果截图

暑假训练(一) 通过的题目_第11张图片



三:思路和感受

    这个题目我直接用递推算出来的公式直接做的。



请教啊,这个题目用递归函数怎么做????????


你可能感兴趣的:(ACM测试)