网易2017秋招编程题

优雅的点

小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。

例如:半径的平方如果为25

优雅的点就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12个点

简单代码:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main()
{
    int r,x,y;
    while(~scanf("%d",&r))
    {
        int cnt=0;
        for(x=1;x*x<=r;x++)
        {
            int t=x*x;
            y=sqrt(r-t);
            if(x*x+y*y==r)
                cnt++;
        }
        printf("%d\n",cnt*4);
    }
    return 0;
}

暗黑的字符串

一个只包含'A'、'B'和'C'的字符串,如果存在某一段长度为3的连续子串中恰好'A'、'B'和'C'各有一个,那么这个字符串就是纯净的,否则这个字符串就是暗黑的。例如:
BAACAACCBAAA 连续子串"CBA"中包含了'A','B','C'各一个,所以是纯净的字符串
AABBCCAABB 不存在一个长度为3的连续子串包含'A','B','C',所以是暗黑的字符串
你的任务就是计算出长度为n的字符串(只包含'A'、'B'和'C'),有多少个是暗黑的字符串。

题目的思路:

f[n]=f[n-1]*2+f[n-2];

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main()
{
    long long a[35];
    a[1]=3,a[2]=9;
    for(int i=3;i<=30;i++)
        a[i]=a[i-1]*2+a[i-2];
    int n;
    while(~scanf("%d",&n))
    {
        printf("%lld\n",a[n]);
    }
    return 0;
}

数字翻转

对于一个整数X,定义操作rev(X)为将X按数位翻转过来,并且去除掉前导0。例如:
如果 X = 123,则rev(X) = 321;
如果 X = 100,则rev(X) = 1.
现在给出整数x和y,要求rev(rev(x) + rev(y))为多少?

思路:就是一个字符串求和的问题

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

void add(char s1[],char s2[],char s3[])
{
    int len1=strlen(s1);
    int len2=strlen(s2);
    int i=0,j=0,flag=0,x,k=0;
    for(;i<len1&&j<len2;i++,j++)
    {
        x=s1[i]+s2[j]-'0'-'0'+flag;
        s3[k++]=x%10+'0';
        flag=x/10;
    }
    while(i<len1)
    {
        x=s1[i]+flag-'0';
        s3[k++]=x%10+'0';
        flag=x/10;
        i++;
    }
    while(j<len2)
    {
        x=s2[j]+flag-'0';
        s3[k++]=x%10+'0';
        flag=x/10;
        j++;
    }
    if(flag==1)
    {
        s3[k]=flag+'0';
    }

}
int main()
{
    char s1[10],s2[10];
    while(~scanf("%s%s",s1,s2))
    {
        char s3[10];
        memset(s3,0,sizeof(s3));
        add(s1,s2,s3);
        int flag=0;
        for(int i=0;i<strlen(s3);i++)
        {
            if(flag==0&&s3[i]=='0')
                continue;
            else
            {
                flag=1;
                printf("%c",s3[i]);
            }
        }
        printf("\n");
    }
    return 0;
}

最大奇约数

小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。例如:f(44) = 11.
现在给出一个N,需要求出 f(1) + f(2) + f(3).......f(N)
例如: N = 7
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3+ 7 = 21
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。

思路:奇数的最大奇约数,就是自己。1~n中的奇数先加一次,然后将奇数剔除,偶数除以2,又变成了奇数相加。

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    long long n;
    while(~scanf("%lld",&n))
    {
        long long sum=0;

        for(long long i=n;i>0;i/=2)
        {
            long long x=(i+1)/2;
            sum+=x*x;
        }
        printf("%lld\n",sum);
    }
    return 0;
}

买苹果:

小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。如果不能购买恰好n个苹果,小易将不会购买。

除了10,奇数,小于6的数,8和6不能组合出来,其余的都可以

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if((n&1)||(n==10)||(n<6))
            printf("-1\n");
        else
        {
            if(n%8==0)
                printf("%d\n",n/8);
            else
                printf("%d\n",n/8+1);
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值