ACM杭电的AC回顾

鉴于太繁琐,打算把以前的存稿全部发出来,反正这几个里面我都在代码前面加了题目的。

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 

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 
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[n])puts("no");
        else puts("yes");
    }
    return 0;
}

2000

/*****************************************************************
输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
*****************************************************************/
#include 
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
#include
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 
#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 
#include
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
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
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 
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 
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 
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 
#include 
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 
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");
    }
}

先到这吧,下面的待会再发.


你可能感兴趣的:(ACM杭电的AC回顾)