1. 程式人生 > >【LDU】新生訓練營杭電100題(一)

【LDU】新生訓練營杭電100題(一)

A - ASCII碼排序 

輸入三個字元後,按各字元的ASCII碼從小到大的順序輸出這三個字元。 Input輸入資料有多組,每組佔一行,有三個字元組成,之間無空格。 Output對於每組輸入資料,輸出一行,字元中間用一個空格分開。 Sample Input
qwe
asd
zxc
Sample Output
e q w
a d s
c x z

#include<stdio.h>
int main()
{
      char a,b,c;
      while(~scanf("%c%c%c",&a,&b,&c))
      {
            getchar();
            int temp;
            if(a>b)
            {
                 temp=a;
                 a=b;
                 b=temp;
            }
            if(a>c)
            {
                 temp=a;
                 a=c;
                 c=temp;
            }
            if(b>c)
            {
                 temp=b;
                 b=c;
                 c=temp;
            }
            printf("%c %c %c\n",a,b,c);

      }
      return 0;


}
B - 計算兩點間的距離  輸入兩點座標(X1,Y1),(X2,Y2),計算並輸出兩點間的距離。 Input輸入資料有多組,每組佔一行,由4個實陣列成,分別表示x1,y1,x2,y2,資料之間用空格隔開。 Output對於每組輸入資料,輸出一行,結果保留兩位小數。 Sample Input
0 0 0 1
0 1 1 0
Sample Output
1.00
1.41

#include<stdio.h>
#include<math.h>
int main()
{
      double x1,x2,y1,y2;
      while(~scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2))
      {
            printf("%.2lf\n",sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));

      }
      return 0;
}
C - 計算球體積  根據輸入的半徑值,計算球的體積。 Input輸入資料有多組,每組佔一行,每行包括一個實數,表示球的半徑。 Output輸出對應的球的體積,對於每組輸入資料,輸出一行,計算結果保留三位小數。 Sample Input
1
1.5
Sample Output
4.189
14.137


        
 
Hint
#define PI 3.1415927
#include<stdio.h>
#define PI 3.1415927
int main()
{
      double r;
      while(~scanf("%lf",&r))
      {
          printf("%.3lf\n",(4.0/3.0)*PI*r*r*r);
      }
      return 0;
}

D - 求絕對值
Problem Description 求實數的絕對值。
Input 輸入資料有多組,每組佔一行,每行包含一個實數。
Output 對於每組輸入資料,輸出它的絕對值,要求每組資料輸出一行,結果保留兩位小數。
Sample Input 123 -234.00
Sample Output 123.00 234.00
#include<stdio.h>
#include<math.h>
int main()
{
     double x;
     while(~scanf("%lf",&x))
     {
          printf("%.2lf\n",fabs(x));
     }
     return 0;

}

E - 成績轉換
Problem Description 輸入一個百分制的成績t,將其轉換成對應的等級,具體轉換規則如下:
90~100為A;
80~89為B;
70~79為C;
60~69為D;
0~59為E;

Input 輸入資料有多組,每組佔一行,由一個整陣列成。
Output 對於每組輸入資料,輸出一行。如果輸入資料不在0~100範圍內,請輸出一行:“Score is error!”。
Sample Input 56 67 100 123
Sample Output E D A Score is error!
#include<stdio.h>
int main()
{
     int x;
     while(~scanf("%d",&x))
     {
           if(x<0||x>100)
           {
               printf("Score is error!\n");
           }
           else
           {
               switch(x/10)
               {
                   case 1:
                   case 2:
                   case 3:
                   case 4:
                   case 5:printf("E\n");break;
                   case 6:printf("D\n");break;
                   case 7:printf("C\n");break;
                   case 8:printf("B\n");break;
                   case 9:
                   case 10:printf("A\n");break;
               }
           }
     }
     return 0;

}
F - 第幾天? 
Problem Description 給定一個日期,輸出這個日期是該年的第幾天。
Input 輸入資料有多組,每組佔一行,資料格式為YYYY/MM/DD組成,具體參見sample input ,另外,可以向你確保所有的輸入資料是合法的。
Output 對於每組輸入資料,輸出一行,表示該日期是該年的第幾天。
Sample Input 1985/1/20 2006/3/12
Sample Output 20 71
#include<stdio.h>
int judge(int year,int month,int day)
{
     int a[13]={0,0,31,59,90,120,151,181,212,243,273,304,334};
     if((year%4==0&&year%100!=0)||(year%400==0))
     {
        if(month>2)
          return a[month]+day+1;
        else
          return a[month]+day;
     }
     else
          return a[month]+day;
}
int main()
{
     int year,month,day;
     while(~scanf("%d/%d/%d",&year,&month,&day))
     {
          printf("%d\n",judge(year,month,day));
     }
     return 0;

}

G - 求奇數的乘積 
Problem Description 給你n個整數,求他們中所有奇數的乘積。
Input 輸入資料包含多個測試例項,每個測試例項佔一行,每行的第一個數為n,表示本組資料一共有n個,接著是n個整數,你可以假設每組資料必定至少存在一個奇數。
Output 輸出每組數中的所有奇數的乘積,對於測試例項,輸出一行。
Sample Input 3 1 2 3 4 2 3 4 5
Sample Output 3 15
#include<stdio.h>
int main()
{
     int n,x;
     while(~scanf("%d",&n))
     {
          int i,ans=1;
          for(i=0;i<n;i++)
          {
              scanf("%d",&x);
              if(x%2)
                 ans*=x;
          }
          printf("%d\n",ans);
     }
     return 0;
}

H - 平方和與立方和 
Problem Description 給定一段連續的整數,求出他們中所有偶數的平方和以及所有奇數的立方和。

Input 輸入資料包含多組測試例項,每組測試例項包含一行,由兩個整數m和n組成。
Output 對於每組輸入資料,輸出一行,應包括兩個整數x和y,分別表示該段連續的整數中所有偶數的平方和以及所有奇數的立方和。
你可以認為32位整數足以儲存結果。
Sample Input 1 3 2 5
Sample Output 4 28 20 152
#include<stdio.h>
int main()
{
     int x,y,temp;
     while(~scanf("%d%d",&x,&y))
     {
          if(x>y)
          {
             temp=x;
             x=y;
             y=temp;
          }
          
          int sum1=0,sum2=0,i;
          for(i=x;i<=y;i++)
          {
              if(i%2==1)
                sum2+=i*i*i;
              else
                sum1+=i*i;
          }
          printf("%d %d\n",sum1,sum2);
     }
     return 0;

}
I - 數值統計 

Problem Description 統計給定的n個數中,負數、零和正數的個數。
Input 輸入資料有多組,每組佔一行,每行的第一個數是整數n(n<100),表示需要統計的數值的個數,然後是n個實數;如果n=0,則表示輸入結束,該行不做處理。
Output 對於每組輸入資料,輸出一行a,b和c,分別表示給定的資料中負數、零和正數的個數。
Sample Input 6 0 1 2 3 -1 0 5 1 2 3 4 0.5 0
Sample Output 1 2 3 0 0 5
#include<stdio.h>
int main()
{
     int n;
     while(~scanf("%d",&n),n)
     {
         int i,zero=0,plus=0,negative=0;
         double x;
         for(i=0;i<n;i++)
         {
            scanf("%lf",&x);
            if(x<0.0)
                negative++;
            else if(x==0.0)
                zero++;
            else
                plus++;
         }
         printf("%d %d %d\n",negative,zero,plus);
     }
     return 0;
}

K - 水仙花數 
Problem Description 春天是鮮花的季節,水仙花就是其中最迷人的代表,數學上有個水仙花數,他是這樣定義的:
“水仙花數”是指一個三位數,它的各位數字的立方和等於其本身,比如:153=1^3+5^3+3^3。
現在要求輸出所有在m和n範圍內的水仙花數。

Input 輸入資料有多組,每組佔一行,包括兩個整數m和n(100<=m<=n<=999)。
Output 對於每個測試例項,要求輸出所有在給定範圍內的水仙花數,就是說,輸出的水仙花數必須大於等於m,並且小於等於n,如果有多個,則要求從小到大排列在一行內輸出,之間用一個空格隔開;
如果給定的範圍內不存在水仙花數,則輸出no;
每個測試例項的輸出佔一行。
Sample Input 100 120 300 380
Sample Output no 370 371
#include<stdio.h>
int main()
{
	int m,n,t,i,j,d[5],g,s,b;
	while(~scanf("%d%d",&m,&n))
	{
	      t=0;
		  for(i=m;i<=n;i++)
		  {
  			    g=i%10;
  			    s=(i/10)%10;
  			    b=i/100;
  			    if(g*g*g+s*s*s+b*b*b==i)
  			    {
					  d[t++]=i;  	
		        }
	      }
	      if(!t)
	      {
      	       printf("no");	
      	  }
		  else
		  {
  		       for(j=0;j<t;j++)
			    {
 				    printf(j==(t-1)?"%d":"%d ",d[j]);	
 				}	
  		  }	
  		  printf("\n");
	}
	return 0;
}

L - 多項式求和
Problem Description 多項式的描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...
現在請你求出該多項式的前n項的和。
Input 輸入資料由2行組成,首先是一個正整數m(m<100),表示測試例項的個數,第二行包含m個正整數,對於每一個整數(不妨設為n,n<1000),求該多項式的前n項的和。
Output 對於每個測試例項n,要求輸出多項式前n項的和。每個測試例項的輸出佔一行,結果保留2位小數。
Sample Input 2 1 2
Sample Output 1.00 0.50
#include<stdio.h>
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
        double i,n,sign=1,ans=0;
		scanf("%lf",&n);
		for(i=1;i<=n;i++)
		{
		     ans+=(1.0/i)*sign;
			 sign*=-1;	
		}
		printf("%.2lf\n",ans);
	}
	return 0;
	
}
M - 素數判定 
Problem Description 對於表示式n^2+n+41,當n在(x,y)範圍內取整數值時(包括x,y)(-39<=x<y<=50),判定該表示式的值是否都為素數。
Input 輸入資料有多組,每組佔一行,由兩個整數x,y組成,當x=0,y=0時,表示輸入結束,該行不做處理。
Output 對於每個給定範圍內的取值,如果表示式的值都為素數,則輸出"OK",否則請輸出“Sorry”,每組輸出佔一行。

Sample Input 0 1 0 0
Sample Output OK
#include<stdio.h>
#include<math.h>
int main()
{
	int x,y;
	while(~scanf("%d%d",&x,&y),(x||y))
	{
	      int i,j,n,flag=1;
		  for(i=x;i<=y;i++)
		  {
  		        n=i*i+i+41;
				for(j=2;j*j<n;j++)
				{
					if(n%j==0)
					  flag=0;
				}	
  		  }
		  if(flag)
		  {
  			   printf("OK\n");
  		  }
		  else
		  {
  		        printf("Sorry\n");	
          }	
	}
	return 0;
}

N - 蟠桃記  Problem Description 喜歡西遊記的同學肯定都知道悟空偷吃蟠桃的故事,你們一定都覺得這猴子太鬧騰了,其實你們是有所不知:悟空是在研究一個數學問題!
什麼問題?他研究的問題是蟠桃一共有多少個!
不過,到最後,他還是沒能解決這個難題,呵呵^-^
當時的情況是這樣的:
第一天悟空吃掉桃子總數一半多一個,第二天又將剩下的桃子吃掉一半多一個,以後每天吃掉前一天剩下的一半多一個,到第n天準備吃的時候只剩下一個桃子。聰明的你,請幫悟空算一下,他第一天開始吃的時候桃子一共有多少個呢?

Input 輸入資料有多組,每組佔一行,包含一個正整數n(1<n<30),表示只剩下一個桃子的時候是在第n天發生的。
Output 對於每組輸入資料,輸出第一天開始吃的時候桃子的總數,每個測試例項佔一行。
Sample Input 2 4
Sample Output 4 22
#include<stdio.h>
#include<stdlib.h>

int f(int n, int x)
{
	if (n == 1)
	{
		return  x;
	}
	else
	{
		return f(n - 1, (x + 1) * 2);
	}
}
int main()
{
	int num;
	while (scanf("%d", &num) != EOF)
	{
		printf("%d\n", f(num, 1));
	}

	return 0;
}


#include<stdio.h>
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		int m=1,i,ans=1;
		for(i=2;i<=n;i++)
		{
	        ans=m;   
			m=((m*2)+1);
			ans+=m;
		}
		printf("%d\n",ans);
	} 
	return 0;
}

O - 青年歌手大獎賽_評委會打分

Problem Description 青年歌手大獎賽中,評委會給參賽選手打分。選手得分規則為去掉一個最高分和一個最低分,然後計算平均得分,請程式設計輸出某選手的得分。
Input 輸入資料有多組,每組佔一行,每行的第一個數是n(2<n<=100),表示評委的人數,然後是n個評委的打分。
Output 對於每組輸入資料,輸出選手的得分,結果保留2位小數,每組輸出佔一行。
Sample Input 3 99 98 97 4 100 99 98 97
Sample Output 98.00 98.50
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
        double *p,sum=0,temp;
        int i,j,k; 
        p=(double *)malloc(sizeof(double)*n);
		for( i=0;i<n;i++)
		{
			scanf("%lf",(p+i));
			sum+=*(p+i);
		}
		for(i=0;i<n-1;i++)
		{
			 k=i;
			for(j=i+1;j<n;j++)
			{
				if(*(p+j)<*(p+k))
				{
					k=j;
				}
			}
			if(k!=i)
			{
				 temp;
				 temp=*(p+i);
				 *(p+i)=*(p+k);
				 *(p+k)=temp;
			} 
		}
		double a=*p;
		double b=*(p+n-1);
		sum=sum-(a+b);
		printf("%.2lf\n",sum/(n-2));
	}
}


P - 偶數求和 

Problem Description 有一個長度為n(n<=100)的數列,該數列定義為從2開始的遞增有序偶數,現在要求你按照順序每m個數求出一個平均值,如果最後不足m個,則以實際數量求平均值。程式設計輸出該平均值序列。
Input 輸入資料有多組,每組佔一行,包含兩個正整數n和m,n和m的含義如上所述。

Output 對於每組輸入資料,輸出一個平均值序列,每組輸出佔一行。

Sample Input 3 2 4 2
Sample Output 3 6 3 7
#include<stdio.h>
#define N 105
int main()
{
	 int n,m;
	while(~scanf("%d%d",&n,&m))
	{
	   int a[N],ans[N],i,j=1,k;
	   for(i=1;i<=n;i++)
	   {
   	       a[i]=i*2;	
   	   }
	    for(i=1;i<=n;i+=(m))
	    {
   	        k=n-i+1;
   	        if(k>m)
	   	   {
        	   ans[j++]=(( (a[i]+a[i+m-1]) )/2); 
       	   }
       	   else
       	   {
   	       	   ans[j]=(a[i]+a[n]) /2;
   	       	   break;
   	       }
    	}
    	for(i=1;i<=j;i++)
    	{
	    	printf(i==j?"%d\n":"%d ",ans[i]);
	    }
	}
	return 0;
}

Q - 資料的交換輸出 
Problem Description 輸入n(n<100)個數,找出其中最小的數,將它與最前面的數交換後輸出這些數。

Input 輸入資料有多組,每組佔一行,每行的開始是一個整數n,表示這個測試例項的數值的個數,跟著就是n個整數。n=0表示輸入的結束,不做處理。
Output 對於每組輸入資料,輸出交換後的數列,每組輸出佔一行。
Sample Input 4 2 1 3 4 5 5 4 3 2 1 0
Sample Output 1 2 3 4 1 4 3 2 5
#include<stdio.h>
int main()
{
	int n,i,j,temp,min,a[105];
	while(~scanf("%d",&n),n)
	{
		scanf("%d",&a[0]);
		min=a[0];
		for(i=1;i<n;i++)
		{
		    scanf("%d",&a[i]);
		}
		for(i=0;i<n;i++)
		{
		   if(min>=a[i])
			{
		        min=a[i];
				j=i;
			}   	
		}
			temp=a[0];
			a[0]=a[j];
			a[j]=temp;
			
		for(i=0;i<n;i++)
			{
				printf(i==n-1?"%d\n":"%d ",a[i]);
			}
	}
	return 0;
}

R - 字串統計 
Problem Description 對於給定的一個字串,統計其中數字字元出現的次數。
Input 輸入資料有多行,第一行是一個整數n,表示測試例項的個數,後面跟著n行,每行包括一個由字母和數字組成的字串。
Output 對於每個測試例項,輸出該串中數值的個數,每個輸出佔一行。
Sample Input 2 asdfasdf123123asdfasdf asdf111111111asdfasdfasdf
Sample Output 6 9
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
	char a[1000];
	int i,len,n,count;
	scanf("%d",&n);
	while(n--)
	{
        count=0;
		scanf("%s",a);
		for(i=0;i<strlen(a);i++)
		{
			if(isdigit(a[i]))
			    count++;
		} 
		printf("%d\n",count);
	}
	return 0;
}

S - 母牛的故事 
Problem Description 有一頭母牛,它每年年初生一頭小母牛。每頭小母牛從第四個年頭開始,每年年初也生一頭小母牛。請程式設計實現在第n年的時候,共有多少頭母牛?
Input 輸入資料由多個測試例項組成,每個測試例項佔一行,包括一個整數n(0<n<55),n的含義如題目中描述。
n=0表示輸入資料的結束,不做處理。
Output 對於每個測試例項,輸出在第n年的時候母牛的數量。
每個輸出佔一行。
Sample Input 2 4 5 0
Sample Output 2 4 6
#include<stdio.h>
int a[100]={
   0,1,2,3,4	
};
void solve()
{
    for(int i=5;i<=60;i++)
	{
		a[i]=a[i-1]+a[i-3];
	}	
}
int main()
{
      int n;
      solve();
	  while(~scanf("%d",&n),n)
	  {
  		  printf("%d\n",a[n]);
  	}
	  return 0;	
}

T - 數列有序! 
Problem Description 有n(n<=100)個整數,已經按照從小到大順序排列好,現在另外給一個整數x,請將該數插入到序列中,並使新的序列仍然有序。
Input 輸入資料包含多個測試例項,每組資料由兩行組成,第一行是n和m,第二行是已經有序的n個數的數列。n和m同時為0標示輸入資料的結束,本行不做處理。
Output 對於每個測試例項,輸出插入新的元素後的數列。
Sample Input 3 3 1 2 4 0 0
Sample Output 1 2 3 4
#include<stdio.h>
#include<stdlib.h>
int main()
{
      int n,m;
      while(~scanf("%d%d",&n,&m),(n||m))
      {
             int *a,i,flag=-1;
             a=(int *)calloc(n,sizeof(n));
             for(i=0;i<n;i++)
             {
                  scanf("%d",&a[i]);
                  if(a[i]>=m&&flag==-1)
                 {
                     flag=i;
                 }
             }
             for(i=0;i<n;i++)
             {
                printf((i==n-1&&i!=flag)?"%d\n":"%d ",i==flag?m:a[i]);
                if(i==flag)
                {
                    flag=-1; i--;
                }
             }
      }
      return 0;

}


U - 絕對值排序 

Problem Description 輸入n(n<=100)個整數,按照絕對值從大到小排序後輸出。題目保證對於每一個測試例項,所有的數的絕對值都不相等。
Input 輸入資料有多組,每組佔一行,每行的第一個數字為n,接著是n個整數,n=0表示輸入資料的結束,不做處理。 

Output 對於每個測試例項,輸出排序後的結果,兩個數之間用一個空格隔開。每個測試例項佔一行。
Sample Input 3 3 -4 2 4 0 1 2 -3 0
Sample Output -4 3 2 -3 2 1 0
#include<stdio.h>
#include<stdlib.h>
int main()
{
     int n;
     while(~scanf("%d",&n),n)
     {
            int *a,i,j,k,temp;
            a=(int *)calloc(n,sizeof(int));
            for(i=0;i<n;i++)
            {
                 scanf("%d",a+i);
            }
            for(i=1;i<n;i++)
            {
                 if(abs(i[a])>abs((i-1)[a]))
                 {
                       temp=i[a];
                       (i)[a]=(i-1)[a];
                       for(j=i-2;j>=0&&abs(temp)>abs(j[a]);j--)
                       {
                             (j+1)[a]=(j)[a];
                       }
                       (j+1)[a]=temp;
                 }
            }
            for(i=0;i<n;i++)
            {
               printf(i==n-1?"%d\n":"%d ",i[a]);
            }
     }
     return 0;


}