编程马拉松大赛试题及代码(C++实现)

本文分享了牛客网编程马拉松大赛中的部分题目,包括NowCoder猜想、分遗产、素数和等,强调了解题时对性能的关注。文章提供了C++代码示例,适合面试前练习。
摘要由CSDN通过智能技术生成

前段时间牛客网举办了编程马拉松大赛,总共86道题,20天内完成。题目难度难中易都有。我发现这些题目,主要关注性能和思维。很多题目用常规方法是不能通过时间要求的。题目是来自于各大oj以及面试题。所以非常适合面试前的练手。
大赛地址:http://www.nowcoder.com/ta/hackathon不知道以后还可不可以用。反正结束了。
这里我贴出一些试题和我做的代码~


NowCoder猜想

题目描述

nowcoder在家极度无聊,于是找了张纸开始统计素数的个数。
设函数f(n)返回从1-n之间素数的个数。
nowcoder 发现:
f(1) = 0
f(10) = 4
f(100) = 25

满足g(m) = 17 * m^2 / 3 - 22 * m / 3 + 5 / 3
其中m为n的位数。
他很激动,是不是自己发现了素数分布的规律了!
请你设计一个程序,求出f(n),来验证nowcoder是不是正确的,也许还可以得诺贝尔奖呢。^_^

输入描述:
输入包括多组数据。
每组数据仅有一个整数n (1≤n≤10000000)。

输出描述:
对于每组数据输入,输出一行,为1->n(包括n)之间的素数的个数。

输入例子:
1
10
65
100
0

输出例子:
0
4
18
25


代码

// write your code here cpp
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;

const int N = 10000000 + 10;
bool prime[N];
int hs[664579 + 10];
void getPrimeTable()
{
    for (int i = 3; i <= 3333; i += 2)
    {
        if (prime[i]==0)
        for (int j = i*i; j < N; j += 2 * i)
            prime[j] = 1;
    }
    int total = 1;
    hs[1] = 2;
    for (int i = 3; i < N; ++i)
    {
        if (i % 2 != 0 && prime[i]==0)
        {

            hs[++total] = i;
        }
    }
}
int main()
{
    getPrimeTable();
    int n, i;
    while (scanf("%d", &n), n)
    {
        for ( i = 1; i <= 664579; ++i)
        if (hs[i] > n && hs[i - 1] <= n)
            break;
        printf("%d\n", i-1);
    }
    return 0;
}

分遗产

时间限制:1秒空间限制:32768K
通过比例:13.93%
最佳记录:0 ms|8460K (来自 只想有创意)

题目描述

有一位阿拉伯老人,生前养有11匹马,他去世前立下遗嘱:大儿子、二儿子、小儿子分别继承遗产的1/2、1/4、1/6。
儿子们想来想去没法分:他们所得到的都不是整数,即分别为11/2、11/4、11/6,总不能把一匹马割成几块来分吧?
聪明的邻居牵来了自己的一匹马,对他们说:“你们看,现在有12匹马了,老大得12匹的1/2就是6匹,老二得12匹的1/4就是3匹, 老三得12匹的1/6就是2匹,还剩一匹我照旧牵回家去。”这样把难分的问题解决了。
现在又有一个老人要分遗产了,他有m匹马(1≤m≤1000000),并且有n个儿子(1≤n≤10),每个儿子分别得到1/a1、1/a2、…、1/an的遗产。
因为马不能分割,并且遗产要全部分完,所以请你用上面那位聪明的邻居的方法计算一下每个儿子能分到几匹马。

输入描述:
输入包括多组测试数据。
每组测试数据包括两行:
第一行为m、n,分别代表老人拥有的马匹数和几个儿子。
第二行有n个数据a1、a2、…、an,依次代表大儿子、二儿子…第n个儿子分到的遗产的份额。(0 < ai < 50)
程序以输入0 0结束,该行不做处理。

输出描述:
按照上面介绍的方法解决这个问题。
如果那种方法不能解决这个问题(即所有儿子不能得到整数匹马),则你的程序要输出”Can’t Solve”;
否者依次输出大儿子、二儿子…得到的马的匹数。
每个数之间有一个空格隔开(最后一个数据后面没有空格)。

输入例子:
11 3
2 4 6
2 2
3 3
0 0

输出例子:
6 3 2
1 1


代码

// write your code here cpp
#include<iostream>
using namespace std;
int  LCM(int num1,int num2){
    int x,y;
    if(num1<num2){
        num1^=num2;num2^=num1;num1^=num2;
    }
    x=num1;y=num2;
    while(y!=0)
    {
  int temp=x%y;
    x=y;
    y=temp;
    }
    return (num1*num2)/x;
}
int main(){

    int n,m;
    while (cin>>m>>n&&n!=0&&m!=0)
    {
        int temp=1;int sum=0;int Multiply=1;
        int heritage[10];
        for (int i = 0; i <n; i++)
        {
            cin>>heritage[i];
        }
        for (int i = 0; i <n; i++)
        {

            temp=LCM(temp,heritage[i]);
            Multiply*=heritage[i];
        }
        for (int i = 0; i <n; i++)
        {
            sum+=temp/heritage[i];
        }
        if (m%sum==0)
        {   int k=m/sum;
        for (int i = 0; i <n-1; i++)
        {
            cout<<k*temp/heritage[i]<<" ";
        }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值