NYIST-2017大一新生第二次周赛题解

来源:互联网 发布:java书籍推荐 豆瓣 编辑:程序博客网 时间:2024/06/08 12:22

题目链接   https://vjudge.net/contest/193071

 

A - 字符串统计

 

for循环遍历 找到数字个数

#include<stdio.h>#include<string.h>char str[10000000];int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%s",str);        int len=strlen(str);        int sum=0;        for(int i=0;i<len;i++)        {            if(str[i]>='0'&&str[i]<='9')                sum++;        }        printf("%d\n",sum);    }    return 0;}
B - 亲和数

#include<stdio.h>#include<string.h>#include<math.h>int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n,m;        scanf("%d%d",&n,&m);        int sum1=0,sum2=0;        for(int i=1;i<=sqrt(n*1.0);i++)        {            if(n%i==0)                sum1+=i+n/i;        }        sum1-=n;        for(int i=1;i<=sqrt(m*1.0);i++)        {            if(m%i==0)                sum2+=i+m/i;        }        sum2-=m;        if(sum1==m&&sum2==n)            printf("YES\n");        else printf("NO\n");    }    return 0;}

C - How many days?

 

#include<stdio.h>#include<string.h>#include<math.h>int main(){    int n,m;    while(~scanf("%d%d",&n,&m),(n||m))    {        int sum=0;//总共过的天数        while(n)        {            sum+=n/m*m;//先加上最多能过的k天的倍数            n=n%m+n/m;//剩下的不够k天的钱再加上获赠的钱            if(n<m)//如果现在有的钱不够k,输出 如果够k 继续循环直至不够k            {                sum+=n;                break;            }        }        printf("%d\n",sum);    }    return 0;}

D - Rightmost Digit

 

快速幂水题 每次 %10

#include<stdio.h>typedef long long LL;int kuai(LL n,LL k){    LL sum=1,p=n;    while(k)    {        if(k&1)            sum=(p*sum)%10;        p=((LL)p*p)%10;        k>>=1;    }    return (int)sum;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        LL n;        scanf("%lld",&n);        printf("%d\n",kuai(n,n));    }    return 0;}
E - 权势二进制

因为每一位都可以选择加1或者加0    所以只要得到各个位上数字的最大值就好

#include<stdio.h>int main(){   int n,ma=0;   scanf("%d",&n);   while(n)   {       int t=n%10;       if(t>ma)        ma=t;       n=n/10;   }   printf("%d\n",ma);}

F - 排序


#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;char a[1009];int b[10000];int main(){    while(~scanf("%s",a))    {        int len=0;        for(int i=0;i<strlen(a);i++)        {            if(a[i]!='5')//如果不是‘5’            {                int sum=0;                 for(;a[i]!='5'&&i<strlen(a);i++) //碰到‘5’或者到字符串末尾则停止                    sum=sum*10+a[i]-'0'; //得到那一串的数值                b[len++]=sum; //存入            }        }        sort(b,b+len);         for(int i=0;i<len-1;i++)            printf("%d ",b[i]);        printf("%d\n",b[len-1]);    }    return 0;}

G - 18岁生日

#include<stdio.h>bool pan(int x)//判断是否为闰年{    if((x%4==0&&x%100)||x%400==0)        return 1;    return 0;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int y,m,d;        scanf("%d-%d-%d",&y,&m,&d);        if(m==2&&d==29)        {            printf("-1\n");        }        else        {            int k=0,sum=0;            for(int i=y+1;i<y+18;i++) //找出从出生后一年到17岁那年有几年为闰年            {                if(pan(i))                    k++;            }            if(pan(y)) //如果出生那年是闰年且月份在2月前闰年数+1            {                if(m<=2)                    k++;            }            if(pan(y+18))//如果18岁那年为闰年且月份在2月后闰年数+1            {                if(m>2)                    k++;            }            printf("%d\n",k*366+(18-k)*365);        }    }}
H - 阿牛的EOF牛肉串

O后面只能接 E或F      E后面是 O E F      F后面是 O E F

假设结尾是O的串数为 a   结尾是E或F的串数为 b

因为 只有结尾是E或 F后面才能添 O  

结尾为O或E或F 后面都能添 E 或F

所以 如果再增加1个字符则   a=b          b=2*(a+b)

而最开始只有1个字符的时候 a=1  ,b=2  然后开始递推   最后输出 a+b

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int main(){    long long n;    while(~scanf("%lld",&n))    {        long long a=2,b=1;        for(long long i=2;i<=n;i++)        {            long long p=a,pp=b;            b=p;            a=pp*2+p*2;        }        printf("%lld\n",a+b);    }    return 0;}

I - 密码

 

#include<stdio.h>#include<string.h>#include<math.h>char str[100];int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%s",str);        int len=strlen(str);        int a1=0,a2=0,a3=0,a4=0;        for(int i=0; i<len; i++)        {            if(str[i]>='0'&&str[i]<='9') a3=1;            if(str[i]>='a'&&str[i]<='z') a2=1;            if(str[i]>='A'&&str[i]<='Z') a1=1;            if(str[i]=='~'||str[i]=='!'||str[i]=='@'||str[i]=='#'||str[i]=='$'||str[i]=='%'||str[i]=='^')                a4=1;        }        if(len<=16&&len>=8&&a1+a2+a3+a4>=3) //只要满足3个条件            printf("YES\n");        else printf("NO\n");    }    return 0;}

J - 求数列的和

 

#include<stdio.h>#include<math.h>int main(){    int n,m;    while(~scanf("%d%d",&n,&m))    {        double sum=(double)n,sun=(double)n;        for(int i=2;i<=m;i++)        {            sum+=sqrt(sun);            sun=sqrt(sun);        }        printf("%.2lf\n",sum);    }    return 0;}

K - 整除的尾数

 

枚举后两位从 0到99  看(尾数加100*a )%b 是否为0 

#include<stdio.h>int main(){    int a,b;   while(~scanf("%d%d",&a,&b)&&a+b)   {       int t=a*100;       int o=0;       for(int i=0;i<100;i++)       {           if((t+i)%b==0)           {               if(o==0)               {                printf("%02d",i);                   o++;               }               else                printf(" %02d",i);           }       }       printf("\n");   }}










原创粉丝点击