csdn每日一练[凑数][]

题目名称:凑数

题目描述

给定一组n个正整数,要求每次选其中一个数乘以或除以一个素数(称为一次凑数),问至少需要凑数多少次可以把所有的数都凑成相等。

输入描述

第一行输入n个正整数(0

输出描述

可以把所有的数都凑成相等需要至少进行的凑数次数t(t>=0)。@

示例

提示

只要把5乘以2,2次以后就可以得到20。

分析

1)想让所有的数组元素计算后相等

首先从题意上提炼核心点是使得数组的所有元素与一定数量的素数相乘后,所有元素的计算结果相等。这很重要,因为这里提炼成算法思维就是求最小公倍数。解题思路如下:

先数组第一个元素和第二个元素求最小公倍数①,结果①和第三个元素求最小公倍数②,结果②和第四个元素求最小公倍数③...以此类推,直到数组遍历完,我们就得到了数组的最小公倍数。

代码示例

#include <stdio.h>
#include <stdlib.h>

// 欧几里得算法求最大公约数
int gcd(int a, int b) {
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}

// 根据公式求最小公倍数
int lcm(int a, int b) {
    return (a * b) / gcd(a, b);
}

2)在得到数组的最小公倍数后,我们要去求每一个元素乘以几次素数能够=最小公倍数。由于在前面我们已经求得数组的最小公倍数,此时每个元素需要求的值=最小公倍数/当前元素值=素数1*素数2*素数3*...*素数n。因此问题就变成了如下示意

算法逻辑是

对于整数n,其由几个素数计算得来,遍历2到n之间的所有数,一旦遇到能够被n整除(即n%i == 0)此时就计算n/i由几个素数计算而来。

代码示例

#include <stdio.h>
#include <stdlib.h>

int factorize(int num) {
    int count = 0;
    for(int i = 2; i <= num; i++) {
        while(num % i == 0) {
            count++;
            num /= i;
        }
    }
    return count;
}

遍历2到n之间的所有数时,由于不是素数的元素已经被前面的元素消除掉了,所以不会存在n%i == 0时i不为素数的情况,例如:当n=20时,如下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会写代码的小可爱&&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值