题解 | #kotori和素因子#

kotori和素因子

https://www.nowcoder.com/practice/7b1c858a3e7a41ed8364178979eaae67


/*
kotori拿到了一些正整数。她决定从每个正整数取出一个素因子。但是,kotori有强迫症,她不允许两个不同的正整数取出相同的素因子。

她想知道,最终所有取出的数的和的最小值是多少?

注:若 a\bmod k== 0amodk==0,则称 kk 是 aa 的因子。若一个数有且仅有两个因子,则称其是素数。显然1只有一个因子,不是素数
*/

#include <stdio.h>
#include<malloc.h>
#include<limits.h>
#include<math.h>

int n;
int min = INT_MAX; //定义最大整数
int* arr;
int* rec;  //用于存放

int isprime(int k) {
    int i = 0;
    for (i = 2; i <= sqrt(k); i++) {
        if (k % i == 0)
            return 0;
    }
    return 1;

}

void dfs(int* arr, int* rec, int index, int sum) {
    int i, j;
    if (index ==n) { // 递归退出条件,找过所有数的素因子。只有递归完所有arr元素才会到这
        if (sum < min)
            min = sum;
        return;
    }

    for (i = 2; i <= arr[index]; i++) {
        if (arr[index] % i == 0 && isprime(i)) { //是arr[index]的素因子?

            int flag = 0; //是否有相同素因子的标志
            for (j = 0; j < index; j++) {

                if (i == rec[j]) { //i在rec里面
                    flag = 1;
                    break;
                }
            }
            if (flag) { //有相同的素因子
                flag = 0;
                continue;

            } else {
                //没有的话继续查找
                rec[index] = i;
                dfs(arr, rec, index + 1, sum + i);
                rec[index] = 0; //回溯
            }
        }
    }
}


int main() {
    int i;
    scanf("%d", &n);
    arr = (int*)malloc(sizeof(int) * n);
    rec = (int*)malloc(sizeof(int) * n);
    for (i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    dfs(arr, rec, 0, 0);

    if (min < INT_MAX)
        printf("%d", min);
    else
        printf("%d", -1);
    free(arr);
    free(rec);
}

C语言刷题 文章被收录于专栏

自己从头开始刷的C语言

全部评论
像猪哥猛啊,我不会用递归
点赞 回复 分享
发布于 2022-12-14 14:05 广东
很完美的dfs喜欢的点个赞吧!
点赞 回复 分享
发布于 2022-10-18 17:46 江苏

相关推荐

01-22 14:36
门头沟学院 Java
不知道怎么取名字_:我就好奇,你是这家的hr还是?咋这都能搞到
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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