您的位置:首页 > 其它

ACM杭电的AC回顾

2016-02-28 20:23 274 查看
鉴于太繁琐,打算把以前的存稿全部发出来,反正这几个里面我都在代码前面加了题目的。

1998

/***************************************************
一个 n 阶方阵的元素是1,2,...,n^2,它的每行,
每列和2条对角线上元素的和相等,这样的方阵叫魔方。
n为奇数时我们有1种构造方法,叫做“右上方”
例如下面给出n=3,5,7时的魔方.
3
8 1 6
3 5 7
4 9 2
5
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
7
30 39 48 1 10 19 28
38 47 7 9 18 27 29
46 6 8 17 26 35 37
5 14 16 25 34 36 45
13 15 24 33 42 44 4
21 23 32 41 43 3 12
22 31 40 49 2 11 20
***************************************************/
#include <stdio.h>

int main()
{
int i,j,n,r,s,t;
int a[100][100];
memset(a,0,sizeof(a));
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
scanf("%d",&n);
i=(n+1)/2;
j=1;
for(r=1;r<=n*n;r++)
{
a[i][j]=r;
if(j==1 && i!=n) //第一行不是最后一列
{
i=i+1;
j=n;
continue;
}else if(j==1 && i==n)  //第一行最后一列
{
j=j+1;
continue;
}else if(j>1 && j<=n && i!=n && a[i+1][j-1]==0) //不是第一行不是最后一列且右上角没有值
{
i=i+1;
j=j-1;
continue;
}else if(j>1 && j<=n && i!=n && a[i+1][j-1])    //不是第一行不是最后一行右上角有值
{
j=j+1;
continue;
}else if(j>1 && j<=n && i==n && a[1][j-1]==0)   //不是第一行是最后一列且上一行第一个没有值
{
i=1;
j=j-1;
continue;
}else if(j>1 && j<=n && i==n && a[1][j-1])   //不是第一行是最后一列且上一行第一个有值
{
j=j+1;
}
}
for(r=1;r<=n;r++)
{
for(s=1;s<=n;s++)
printf("%4d",a[s][r]);
printf("\n");
}
}
}


1999

/**************************************************
s(n)是正整数n的真因子之和,即小于n且整除n的因子和.
例如s(12)=1+2+3+4+6=16.如果任何数m,s(m)都不等于n,
则称n为不可摸数.
*************************************************/
#include <stdio.h>
int a[1100000],has[1001];

void init()
{
int i,j;
for(i=1;i<=1000000;i++)         //打表,生成所有的不可捉摸数和可捉摸数。
{
for(j=i*2;j<=1000000;j+=i)
{
a[j]+=i;
}
}
for(i=1;i<=1000000;i++)
{
if(a[i]<=1000)has[a[i]]=1;
}
}

int main()
{
int n,i,j,t,ans;
init();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(has
)puts("no");
else puts("yes");
}
return 0;
}


2000

/*****************************************************************
输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
*****************************************************************/
#include <stdio.h>
int main()
{
char a,b,c,temp;
while(scanf("%c%c%c",&a,&b,&c)!=EOF)
{
getchar();
if(a>b){temp=a;a=b;b=temp;}
if(a>c){temp=a;a=c;c=temp;}
if(b>c){temp=c;c=b;b=temp;}
printf("%c %c %c\n",a,b,c);
}
}


2001

/*******************************************
输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。
*******************************************/
#include<stdio.h>
#include<math.h>
int main()
{
double x1,x2,y1,y2,d;

while(scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2)!=EOF)
{
d=(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
d=pow(d,0.5);
printf("%.2lf\n",d);
}
return 0;
}


2002

/*******************************************
根据输入的半径值,计算球的体积。
*******************************************/
#include <stdio.h>
#define PI 3.1415927
int main()
{
double r;
double v;
while(scanf("%lf",&r)!=EOF)
{
v=4*PI*r*r*r/3;
printf("%.3lf\n",v);
}
}


2003

/*******************************************
求实数的绝对值
*******************************************/
#include <stdio.h>
#include<math.h>
int main()
{
double s;
while(scanf("%lf",&s)!=EOF)
{

s=fabs(s);
printf("%.2lf\n",s);
}
return 0;
}


2004

/****************************************************************
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
*****************************************************************/
#include<stdio.h>
void main()
{
int a;
while(scanf("%d",&a)!=EOF)
{
char b='A';
getchar();
if(a<0||a>100)
printf("Score is error!\n");
else if(a<60)
printf("E\n");
else
{
a=(100-a)/10;
b=b+a;
printf("%c\n",b);
}

}
}


2005

/*************************************
给定一个日期,输出这个日期是该年的第几天。
**************************************/
#include<stdio.h>
void main()
{
int month , day=0, year=0,t,date=0;

while((scanf("%d/%d/%d",&year,&month,&date))!=EOF)
{
if((year%4==0&&year%100!=0)||year%400==0)
{
t=29;
}else{t=28;}

switch(month)
{
case 1:  day=0;break;
case 2:  day=31;break;
case 3:  day=t+31;break;
case 4:  day=t+31+31;break;
case 5:  day=t+31+31+30;break;
case 6:  day=t+31+31+30+31;break;
case 7:  day=t+31+31+30+31+30;break;
case 8:  day=t+31+31+30+31+30+31;break;
case 9:  day=t+31+31+30+31+30+31+31;break;
case 10: day=t+31+31+30+31+30+31+31+30;break;
case 11: day=t+31+31+30+31+30+31+31+30+31;break;
case 12: day=t+31+31+30+31+30+31+31+30+31+30;break;
}
printf("%d\n",day+date);

}
}


2006

/**********************************
给你n个整数,求他们中所有奇数的乘积
**********************************/
#include <stdio.h>
int main()
{
int a,n,sum;
while(scanf("%d",&n)!=EOF)
{
sum=1;
while(n--)
{
scanf("%d",&a);
if(a%2)
sum*=a;
}
printf("%d\n",sum);
}
}


2007

/*******************
给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。
*******************/
#include <stdio.h>
int main()
{
int a,b,c,sum1,sum2;
while(scanf("%d%d",&a,&b)!=EOF)
{
sum1=sum2=0;   //记得清零
if(a>b)        //输入需要调整前后大小
{c=a;a=b;b=c;}
for(a;a<=b;a++)
if(a%2)
sum2+=a*a*a;
else
sum1+=a*a;
printf("%d %d\n",sum1,sum2);
}
}


2008

/*********************************************
输入数据有多组,每组占一行,每行的第一个数是整数n(n<100)
表示需要统计的数值的个数
然后是n个实数;如果n=0,则表示输入结束,该行不做处理。

*********************************************/
#include <stdio.h>
void main()
{
int n,i,fi,se,th;
float a;
while(scanf("%d",&n)!=EOF)
{
if(n!=0)
{
fi=0,se=0,th=0;
while(n--)
{
scanf("%f",&a);
if(a>0)
fi++;
if(a<0)
se++;
if(a==0)
th++;
}
printf("%d %d %d\n",se,th,fi);
}
}

}


2009

/**************************************************************
数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
**************************************************************/
#include <stdio.h>
#include <math.h>
void main()
{
int n,m;
double x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
y=n;x=0;
while(m--)
{
x=x+y;
y=sqrt(y);
}
printf("%.2lf\n",x);
}
}


2010

/******************************************************************
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说
输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,
则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行
***********************************************************************/
#include <stdio.h>
void main()
{
int m,n,a,b,c,num;
while(scanf("%d%d",&m,&n)!=EOF)
{
num=0;
for(m;m<=n;m++)
{
a=m/100;
b=(m/10)%10;
c=m%10;
if(m==a*a*a+b*b*b+c*c*c)
{
if(num!=0)
printf(" ");
printf("%d",m);
num++;
}
}
if(num==0)
printf("no\n");
else
printf("\n");
}
}


先到这吧,下面的待会再发.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: