2010有道难题-练习赛

来源:互联网 发布:2016年网络伤感歌曲 编辑:程序博客网 时间:2024/05/18 11:49

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有道难题-练习题

 

题目虽然简单,所以应该赢在时间上。熟能生巧,多练才是王道。若平时不磨刀,要用时刀不锋利很难效率高。

原创粉丝点击