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有道难题-练习题 2010有道难题-练习题](http://www.sinaimg.cn/uc/myshow/blog/misc/gif/E___6724ZHE1SIGG.gif)
题目虽然简单,所以应该赢在时间上。熟能生巧,多练才是王道。若平时不磨刀,要用时刀不锋利很难效率高。