题解 | #素数伴侣#

素数伴侣

http://www.nowcoder.com/practice/b9eae162e02f4f928eac37d7699b352e

这是一个超时的题解, 用的是最呆的穷举+递归。(因为算法什么的都不会,所以只能是靠蛮力了(ಥ_ಥ) ) alt 这里显示5组通过。(mgj的题目也不说测试用这么多用例,还这么大的数。

不然我也不写了(╬ ̄皿 ̄)=○)

因为这里没有实际输出。 所以我又粘贴到其他c语言在线网站试了一下。看样子至少也算是解出来了,算是没全白费功夫。 alt

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
                                                         
#define u16 unsigned short

/**
 * @brief   判断是否是素数伴侣
 * @param   val1 数1
 * @param   val2 数2
 * @return  伴侣数量
 */
u16 If_PrimeMate(u16 val1, u16 val2)
{
    int val = val1 + val2;
    int mid = (int)sqrt((double)val);
    
    for(int i = 2; i <= mid; i++)
        if(val % i == 0)
            return 0;//能被整除
    
    return 1;
}

/* 
* @brief 获取素数伴侣的最多数目
* @param src 需要搭配的正整数数组
* @param num 正整数个数
* @return 素数伴侣的最多数目
*/
u16 Get_Max_PrimeMate(u16 *src, int num)
{
    //使用递归,只有两个数时,直接搭配
    if(num == 2)
        return If_PrimeMate(src[0],src[1]);
    
    u16 max_num = 0;
    
    //轮询所有正整数的两两组合
    for(int i = 0; i < num-1; i++)
        for(int j = i+1; j < num; j++)
        {
            u16 result = 0;
            
            //求挑选出来的两个数是否是"素数伴侣"
            result += If_PrimeMate(src[i],src[j]);
            
            //将数组src中的src[i]和src[j]剔除,重新组成一个数组(内存块)。
            //注:这里src其他元素的顺序是不变的。但是否有序不影响结果,这里只是想把剩余的元素组成内存块,便于调用。
            u16 *temp = (u16 *)malloc(sizeof(u16) * (num - 2));
            memcpy(temp,src,sizeof(u16) * i);                        //将src的前 i 个数拷贝到temp
            memcpy(&temp[i],&src[i+1],sizeof(u16) * (j-i-1));        //将src[i] 到 src[j]之间的数拷贝到temp的后面(接着上一次拷贝的地址)
            memcpy(&temp[j-1],&src[j+1],sizeof(u16) * (num-j-1));    //将src[j]后面的数拷贝到temp的后面(接着上一次拷贝的地址)
            
            //寻找挑选剩下的数的“素数伴侣”个数
            result += Get_Max_PrimeMate(temp, num-2);
            
            free(temp);
            
            //找到最大的数
            if(result > max_num)
                max_num = result;
        }
    
    return max_num;
}

int main(void)
{
    u16 recv_num[100],n;
    
    while(scanf("%d",&n) != EOF)
    {
        for(int i = 0; i < n; i++)
            scanf("%d",&recv_num[i]);
        
        printf("%d\n",Get_Max_PrimeMate(recv_num,n));
    }
    
    return 0;
}
全部评论
你是懂暴力的
点赞 回复 分享
发布于 2023-05-06 16:21 四川

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 14:45
bg是二本双一流硕,目标是Java后端开发岗,投暑期实习0大厂面试,只有极少的大厂测开,可能投的晚加上简历太烂加上0实习?求大佬们给个建议
程序员小白条:别去小厂,初创或者外包,尽量去中小,100-499和500-999,专门做互联网产品的,有公司自研的平台和封装的工具等等,去学习一些业务相关的,比如抽奖,积分兑换,SSO认证,风控,零售等等,目标 Java 后端开发吗?你要不考虑直接走大厂测开?如果技术不行的话,有面试你也很难过的
实习,不懂就问
点赞 评论 收藏
分享
Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
ohs的小木屋:比不少实习待遇高了
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务