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

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

 

A - 字符串统计

 

for循环遍历 找到数字个数

#include
#include

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='0'&&str[i]<='9')
                sum++;
        }
        printf("%d\n",sum);
    }
    return 0;
}
B - 亲和数

#include
#include
#include

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
#include
#include

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

D - Rightmost Digit

 

快速幂水题 每次 %10

#include
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
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
#include
#include
using namespace std;

char a[1009];
int b[10000];
int main()
{
    while(~scanf("%s",a))
    {
        int len=0;
        for(int i=0;i

G - 18岁生日

#include
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;i2)
                    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
#include
#include
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
#include
#include
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='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

#include
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
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");
   }
}










你可能感兴趣的:(NYIST-2017大一新生第二次周赛题解)