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;
}