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,肯定沒問題。
題目雖然簡單,所以應該贏在時間上。熟能生巧,多練纔是王道。若平時不磨刀,要用時刀不鋒利很難效率高。