2010有道难题练习赛2.

 

1       A:7无关的数

时间限制:

1000ms

内存限制:

65536kB

描述

一个正整数,如果它能被7整除,或者它的十进制表示法中某个位数上的数字为7,则称其为与7相关的数.现求所有小于等于n(n<100)的与7无关的正整数的平方和.

输入

输入为一行,正整数n,(n<100)

输出

输出小于等于n的与7无关的正整数的平方和

样例输入

21

样例输出

2336
 
 

#include <stdio.h>

 

bool ok(int n)

{

       if(n%7==0)

              return true;

       for(;n;n/=10)

       {

              if(n%10==7)

                     return true;

       }

 

       return false;

}

 

int main(int argc, char *argv[])

{

       int n;

       long long sum=0;

       scanf("%d", &n);

       for(int i=1; i<=n;i++)

       {

              if(!ok(i))

                     sum += i*i;

       }

 

       printf("%lld",sum);

       return 0;

}

 

2       B:unix纪元

时间限制:

1000ms

内存限制:

65536kB

描述

在著名的unix系统中,使用了一种简洁高效的时间表示方法,即:
将1970年1月1日0点作为“unix纪元”的原点,从1970年1月1日开始经过的秒数存储为一个32位整数

请编写一个程序,帮助把一个unix时间辍,转换成形如"YYYY-mm-dd HH:ii:ss"的格式,其中的字母分别代表

YYYY

4 位数字完整表示的年份

mm

数字表示的月份,有前导零的 2 位数字

dd

月份中的第几天,有前导零的2位数字

HH

小时,24 小时格式,有前导零

ii

有前导零的分钟数

ss

秒数,有前导零

输入

输入数据有若干行,每行包含一个整数t,(0<=t<2^31)

输出

对每一行输入数据,输出一行,为形如“YYYY-mm-dd HH:ii:ss”格式的时间

样例输入

10

1234567890

样例输出

1970-01-01 00:00:10

2009-02-13 23:31:30

 

#include <stdio.h>

 

#define time_t   long

#define EPOCH_YR   1970

#define FIRSTDAYOF(timp)         (((timp)->tm_wday - (timp)->tm_yday + 420) % 7)

#define FIRSTSUNDAY(timp)      (((timp)->tm_yday - (timp)->tm_wday + 420) % 7)

#define LEAPYEAR(year)             (!((year) % 4) && (((year) % 100) || !((year) % 400)))

#define SECS_DAY   (24L * 60L * 60L)

#define TIME_MAX   ULONG_MAX

#define YEAR0   1900

#define YEARSIZE(year)      (LEAPYEAR(year) ? 366 : 365)

 

 struct tm {

   int tm_sec;                   /* seconds after the minute [0, 59] */

   int tm_min;                   /* minutes after the hour [0, 59] */

   int tm_hour;                  /* hours since midnight [0, 23] */

   int tm_mday;                  /* day of the month [1, 31] */

   int tm_mon;                   /* months since January [0, 11] */

   int tm_year;                  /* years since 1900 */

   int tm_wday;                  /* days since Sunday [0, 6] */

   int tm_yday;                  /* days since January 1 [0, 365] */

   int tm_isdst;                 /* Daylight Saving Time flag */

 };

 

 const int _ytab[2][12] = {

                 { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },

                 { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }

         };

 

 struct tm

 gmtime( const time_t *timer)

 {

         struct tm br_time;

         register struct tm *timep = &br_time;

         time_t time = *timer;

         register unsigned long dayclock, dayno;

         int year = EPOCH_YR;

 

         dayclock = (unsigned long)time % SECS_DAY;

         dayno = (unsigned long)time / SECS_DAY;

 

         timep->tm_sec = dayclock % 60;

         timep->tm_min = (dayclock % 3600) / 60;

         timep->tm_hour = dayclock / 3600;

         timep->tm_wday = (dayno + 4) % 7;       /* day 0 was a thursday */

         while (dayno >= YEARSIZE(year)) {

                 dayno -= YEARSIZE(year);

                 year++;

         }

         timep->tm_year = year - YEAR0;

         timep->tm_yday = dayno;

         timep->tm_mon = 0;

         while (dayno >= _ytab[LEAPYEAR(year)][timep->tm_mon]) {

                 dayno -= _ytab[LEAPYEAR(year)][timep->tm_mon];

                 timep->tm_mon++;

         }

         timep->tm_mday = dayno + 1;

         timep->tm_isdst = 0;

 

         return br_time;

 }

 

 

int main(int argc, char *argv[])

{

       long t;

       while(scanf("%d",&t))

       {

              time_t tm_t=t;

              struct tm tm_ = gmtime(&tm_t);

              printf("%02d-%02d-%02d %02d:%02d:%02d\n",1900+tm_.tm_year, 1+tm_.tm_mon,tm_.tm_mday,

                      tm_.tm_hour,tm_.tm_min,tm_.tm_sec);

       }

 

       return 0;

}

 

 

3       C:和数

时间限制:

1000ms

内存限制:

65536kB

描述

给定一个整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3

输入

第一行是一个整数T,表示一共有多少组数据。 1<= T <= 100
接下来的每组数据共两行,第一行是数列中数的个数n ( 1 <= n <= 100),第二行是由n个整数组成的数列。

输出

对于每组数据,输出一个整数(占一行),就是数列中等于其他两个数之和的数的个数。

样例输入

2
4
1 2 3 4
5
3 5 7 9 10

样例输出

2
1

#include <stdio.h>

 

 

int n;

long data[100];

 

int GetNum()

{

       int num=0;

 

      

       for(int k=0; k<n; k++)

       {

              for(int i=0; i<n;i++)

              {

                     if(k==i)

                            continue;

 

                     for(int j=i+1;j<n;j++)

                     {

                            if(k==j)

                                   continue;

 

                            if( data[k]==data[i]+data[j] )

                                   goto Find;

                     }

              }

              continue;

Find:

              num++;

       }

       return num;

}

 

int main(int argc, char *argv[])

{

       int T;

      

       scanf("%d", &T);

       while(T--)

       {

              scanf("%d", &n);

              for(int i=0; i<n;i++)

                     scanf("%d", &data[i]);

              //initSet();

              printf("%d\n",GetNum());

       }

 

      

       return 0;

}

Powered by Jekyll and Theme by solid

本站总访问量