2010有道難題-練習賽

A題十分簡單:求與7無關的平方和。

#include<stdio.h>
int main()
{
int n,i,sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
if((i%7==0)||(i%10==7)||(i/10==7))
continue;
else
sum=sum+(i*i);
}
printf("%d/n",sum);
return 0;

}

B題其實不難,就是判斷循環方面比較麻煩,一不小心就會弄錯:

題意是把秒數轉換成樣例的時間格式,起始點是1970年1月1日

//樣例輸入
//10
//1234567890
//樣例輸出
//1970-01-01 00:00:10
//2009-02-13 23:31:30

#include<stdio.h>

int main()
{
 long day[25][6];//輸出
 long n;   //輸入的總秒數
 int i=0,j;
 while(scanf("%d",&n)!=EOF)
 {
  day[i][0]=1970;//年
  day[i][1]=1;   //月
  day[i][2]=1;   //日
  
  day[i][5]=n%60; //秒
  day[i][4]=n/60%60;  // 分
  day[i][3]=n/3600%24;  //時
  
  n/=(3600*24);//天數
  
  while(n>=366)
  {
   day[i][0]++;//年份加1
   if((day[i][0]%4==0&&day[i][0]%100!=0)||day[i][0]%400==0)  //閏年
   n-=366;
   else   //非閏年
   n-=365; 
  }
  if(!((day[i][0]%4==0&&day[i][0]%100!=0)||day[i][0]%400!=0)&&n>=365)//閏年
  {
   day[i][0]++;
   n-=365;
  }
  
  while(n>=31)
  {
   day[i][1]++;//月份
   if(((day[i][0]%4==0&&day[i][0]%100!=0)||day[i][0]%400==0)&&(day[i][1]==1))//閏年的2月份
   n-=29;
   else 
   {
    switch(day[i][1])
    {
     case 2:
     case 4:
     case 6:
     case 9:
     case 11:n-=31;
     break;
       
     case 5:
     case 7:
     case 10:
     case 12:n-=30;
     break;
     
     case 1:n-=28;
     break;
    }
     }
  }
  
  if(((day[i][0]%4==0&&day[i][0]%100!=0)||day[i][0]%400==0)&&(day[i][1]==2)&&n>=29)//閏年2月份
  {
   day[i][1]++;//月份
   day[i][2]+=(n-29);//日數
  }
  else if(!( (day[i][0]%4==0&&day[i][0]%100!=0) ||day[i][0]%400==0)&&(day[i][1]==2)&&n>=28)//非閏年2月份
  {
   day[i][1]++;
   day[i][2]+=(n-28);
  }
  else if(((day[i][1]==4)||(day[i][1]==6)||(day[i][1]==9)||(day[i][1]==11))&&n>=30)//4,6,9,11月份
  {
   day[i][1]++;
   day[i][2]+=(n-30);
  }
  else  //其他
  {
   day[i][2]+=n;
  }
  i++;
 }
 for(j=0;j<i;j++)
 printf("%04ld-%02ld-%02ld %02ld:%02ld:%02ld/n",day[j][0],day[j][1],day[j][2],day[j][3],day[j][4],day[j][5]);
 return 0;
}

閏年條件的判斷,可別記錯了。

而我當時這題主要是在switch中大意出錯了,case中減去的應該是上個月的天數。

所以在case判斷中,應該以將要減去的天數爲因變量,選擇月份做case;而不是根據case中的月份爲因變量,選擇要減去的天數。

C題雖然分數高,但是也挺容易的。

給定一個整數序列,判斷其中有多少個數,等於數列中其他兩個數的和。 比如,對於數列1 2 3 4, 這個問題的答案就是2, 因爲3 = 2 + 1, 4 = 1 + 3。

//樣例輸入
//2
//4
//1 2 3 4
//5
//3 5 7 9 10
//樣例輸出
//2
//1

#include<stdio.h>
#include<stdlib.h>
int main()
{
 int n,i,m,j,p,q,l;
 int *in,*out,*num;
 scanf("%d",&n);
    in=(int*)malloc(n*sizeof(int));
    out=(int*)calloc(n,sizeof(int));
    for(i=0;i<n;i++)
    {
     scanf("%d",&m);
     num=(int*)malloc(m*sizeof(int));
     for(j=0;j<m;j++)
     {
      scanf("%d",num+j);
  }
  for(p=0;p<m;p++)
  for(q=p+1;q<m;q++)
  {
   for(l=q+1;l<m;l++)
   if( (*(num+l)) ==( (*(num+q)) + (*(num+p)) ) )
   (*(out+i))++;
  }
 }
 for(i=0;i<n;i++)
 printf("%d/n",*(out+i));
 return 0;
}
這題當時由於卡在第二題,而沒有時間寫,白白耽誤了時間。

可以看到題目給的樣例的序列都是遞增的,而我寫的方法也只是在遞增的情況下。不過題目沒有明確指出是不是遞增。所以我寫是這題的代碼還有待驗證。

不過解決辦法也是很簡單的。若這樣提交上去沒有AC,那麼就馬上加上一個冒泡法將序列排序,再拿去AC,肯定沒問題。2010有道難題-練習題

 

題目雖然簡單,所以應該贏在時間上。熟能生巧,多練纔是王道。若平時不磨刀,要用時刀不鋒利很難效率高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章