2010有道难题练习赛

之所以写这篇文章是为了帮助我个人记录一些东西,没有任何其他目的。其源程序仅供参考!

1
时间限制:
1000ms
内存限制:
65536kB
描述
计算a加b。
输入
一行,用空格分开的两个整数a和b。
其中0≤a, b≤10000。
输出
一个整数,为a加b的和。
样例输入
1 2
样例输出
3
参考样例: #include<stdio.h>
void main()
{
  int x,y,sum;
  scanf("%d%d",&x,&y);
  sum=x+y;
  printf("%d/n",sum);
}
2
时间限制:
1000ms
内存限制:
65536kB
描述
计算a的b次方对9907取模的值。
输入
第一行有一个正整数T,表示有T组测试数据。
接下来T行,每行是一组测试数据,包含两个整数a和b。
其中T<=10000, 0 <=a,b < 2^31。
输出
有T行,依次输出每组数据的结果。
样例输入
3
1 2
2 3
3 4
样例输出
1
8
81
参考样例: #include<stdio.h>
#include<stdlib.h>
long mod(long a,long b,int t);
void main()
{
  int T,i;
  long *x,*y,*z;
  scanf("%d",&T);
  x=(long *)malloc(T*sizeof(long));
  y=(long *)malloc(T*sizeof(long));
  z=(long *)malloc(T*sizeof(long));
    for(i=0;i<T;i++)
      scanf("%ld%ld",x+i,y+i);
 
  for(i=0;i<T;i++)
  {
   
   *(z+i)=mod(*(x+i),*(y+i),T);
  }
  for(i=0;i<T;i++)
  printf("%ld/n",*(z+i));
  free(x);
  free(y);
  free(z);
}

long mod(long a,long b,int t)
{
int l[t],z=-1;
long y;
 for(;b!=1;b>>=1)
 {
 z++;
 if(b%2==0) l[z]=0;
 else l[z]=1;
 }

y=a*a%9907;
 for(;z>0;z--)
 {
 if(l[z]) y=(y*a%9907)*(y*a%9907)%9907;
 else y=y*y%9907;
 }
if(l[0]) y=(y*a%9907);
return y;
}
3
时间限制:
1000ms
内存限制:
65536kB
描述
菲波那切数列可以用下列的式子表示:
f(1)=1
f(2)=1
f(n)=f(n-1)+f(n-2) (n>=3)

现在我们根据这个规则定义另一种数列 命名为"辛波那切数列", 它是这样定义的:
s(x)=0 (x<0)
s(x)=1 (0<=x<1)
s(x)=s(x-1)+s(x-3.14) (x>=1)

现在需要计算出s(x) MOD 1000000007的值。
输入
第一行有一个正整数T表示有T组测试数据。
接下来T行,每行包含一个数x。
其中 T<=10000, -1000.0<=x<=1000.0
输出
有T行,依次输出每组数据的结果。
样例输入
3
-1
0.667
3.15
样例输出
0
1
2
参考样例: #include<stdio.h>
#include<stdlib.h>
const int C = 1500000;
int ans[3000000];
unsigned long lxy(long a);
void main()
{
  int T,i;
  long a;
  unsigned long *z;
  double *x;
  scanf("%d",&T);
  x=(double*)malloc(T*sizeof(double));
  z=(unsigned long*)malloc(T*sizeof(unsigned long));
    for(i=0;i<T;i++)
      scanf("%lf",x+i); 
  for(i=0;i<T;i++)
  {
   a=(long)(*(x+i)*1000);
   *(z+i)=lxy(a);
  }
  for(i=0;i<T;i++)
  printf("%lu/n",*(z+i));
  free(x);
  free(z);
}
unsigned long lxy(long a)
{
    unsigned long b;
    if(a<0)return 0;
    else if(a>=0&&a<1000)return 1;
    else
    {
    if(ans[C+a]) return ans[C+a];
    ans[C+a]=lxy(a-1000)+lxy(a-3140)%1000000007;
    return ans[C+a];
    }
}
4
时间限制:
1000ms
内存限制:
65536kB
描述
一个正整数,如果它能被7整除,或者它的十进制表示法中某个位数上的数字为7,则称其为与7相关的数.现求所有小于等于 n(n<100)的与7无关的正整数的平方和.
输入
输入为一行,正整数n,(n<100)
输出
输出小于等于n的与7无关的正整数的平方和
样例输入
21
样例输出
2336
参考样例: #include<stdio.h>
#include<stdlib.h>

void main()
{
  int n,i;
  long a=0;
 
  scanf("%d",&n);
 
  for(i=1;i<=n;i++)
  {
    if(i%7==0||i/10==7||i%10==7)continue;  
    else a+=i*i;
  }
  printf("%ld/n",a);
}

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

请编写一个程序,帮助把一个unix时间辍,转换成形如"YYYY-mm-dd HH:ii:ss"的格式,其中的字母分别代表
YYYY4 位数字完整表示的年份
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>
#include<string.h>
#include<stdlib.h>
void main()

{  
    int nian=1970,yue=1,ri=1,shi,fen,miao,day,a,b,c;
    int i=0;
    int t,x;
    unsigned long *sec;
    while (scanf("%d",&x)!=EOF)
    {   
    *(sec+i)=x;
        i++;
    } 
   t=i;
   for(i=0;i<t;i++)
   {
    day=(int)(*(sec+i)/86400);
    shi=(int)(*(sec+i)%86400/3600);
    fen=(int)(*(sec+i)%86400%3600/60);
    miao=(int)(*(sec+i)%86400%3600%60);
    if(day>1461)
    {   
        a=day/1461;
        b=day%1461;
        c=b/365;
        ri=b%365;       
        nian+=a*4+c;
    if(c==2)
    {
        if(ri>31)
        {
            ri-=31;yue=2;
            if(ri>29)
            {
            ri-=29;yue=3;
            if(ri>31)
            {
            ri-=31;yue=4;
            if(ri>30)
            {
            ri-=30;yue=5;
            if(ri>31)
            {
            ri-=31;yue=6;
            if(ri>30)
            {
            ri-=30;yue=7;
            if(ri>31)
            {
            ri-=31;yue=8;
            if(ri>31)
            {
            ri-=31;yue=9;
            if(ri>30)
            {
            ri-=30;yue=10;
            if(ri>31)
            {
            ri-=31;yue=11;
            if(ri>30)
            {
            ri-=30;yue=12;
            }
            }
            }
            }
            }
            }
            }
            }
            }
            }
        }
    }
    else
    {       
        if(ri>31)
        {
            ri-=31;yue=2;
            if(ri>28)
            {
            ri-=28;yue=3;
            if(ri>31)
            {
            ri-=31;yue=4;
            if(ri>30)
            {
            ri-=30;yue=5;
            if(ri>31)
            {
            ri-=31;yue=6;
            if(ri>30)
            {
            ri-=30;yue=7;
            if(ri>31)
            {
            ri-=31;yue=8;
            if(ri>31)
            {
            ri-=31;yue=9;
            if(ri>30)
            {
            ri-=30;yue=10;
            if(ri>31)
            {
            ri-=31;yue=11;
            if(ri>30)
            {
            ri-=30;yue=12;
            }
            }
            }
            }
            }
            }
            }
            }
            }
            }
        }
        else yue=1;
    }
       
    }   
    printf("%04d-%02d-%02d %02d:%02d:%02d/n",nian,yue,ri,shi,fen,miao);

   }
}

6
时间限制:
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>
#include<stdlib.h>

void main()
{
  int i,j,k,m,n,h,a,*b,c[50],t=0;
  int **lie=NULL;
  scanf("%d",&a);
  b=(int*)malloc(a*sizeof(int));
  lie=(int **)malloc(a*sizeof(int *));
    for(i=0;i<a;i++)
     {
     scanf("%d",b+i);
          lie[i]=(int *)malloc(*(b+i)*sizeof(int));
     for(j=0;j<*(b+i);j++)
       scanf("%d",&lie[i][j]);
    }
    for(i=0;i<a;i++)
    {
    h=0;
     for(j=0;j<*(b+i);j++)
       {    h=0;
        for(k=0;k<*(b+i);k++)
        {
           
                for(m=k+1;m<*(b+i);m++)
                {       
                                       
                    if(j!=k&&j!=m)
                    {
                      if(lie[i][j]==lie[i][k]+lie[i][m])
                      {   
                        c[h]=lie[i][k];
                        for(n=0;n<h;n++)
                        {
                          if(c[n]==lie[i][k]||c[n]==lie[i][m])
                            {t--;h--;}
                        }                       
                        h++;
                          t++;
                       
                      }
                    }
                }
           
           
        }
       }
    printf("%d/n",t);
    t=0;
    }

  for(i=0;i<a;i++)
    { free(lie[i]);lie[i]=NULL; }
    free(lie);
    lie= NULL;
  free(b);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值