题解 | #素数伴侣#

素数伴侣

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 四川

相关推荐

找个工作&nbsp;学历是要卡的&nbsp;要求是高的&nbsp;技能不足是真的&nbsp;实习经验是0的&nbsp;简历无处可写是事实的&nbsp;钱不好赚是真的&nbsp;想躺平又不敢躺&nbsp;也不甘心躺&nbsp;怕自己的灵感和才华被掩埋甚至从未被自己发现&nbsp;又质疑自己是否真正有才华
码农索隆:你现在啊,你心里都明白咋回事,但是你没办法改变现状,一想到未来,你又没有信心狠下心来在当下努力。 得走出这种状态,不能一直困在那里面,哪不行就去提升哪,你一动不动那指定改变不了未来,动起来,积少成多才能越来越好
点赞 评论 收藏
分享
头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
无实习如何秋招上岸
点赞 评论 收藏
分享
CARLJOSEPH...:宝宝你戾气太大了
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

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