有一个正整数N可以分解成若干个正整数之和,问如何分解能使这些数的乘积最大?
2018-02-23 17:23
302 查看
这个题若无整数条件限制,其实答案是全部分解为e(2.71828的那个e)拿到此题,想起了天平称小球问题:n个球中有一个是轻的,试问:怎样用一个没有砝码的天平,用最少的次数找出是哪个球,请算出最少次数。这个题的答案是:当 log3(n)为整数时,最少称log3(n)次,否则,最少称( [log3(n)]+1 )次。于是乎,猜测本题应该是将N尽量分解为若干个3,直到不能分解出3,再做出适当的调整。
就本题而言,易知,N必为 3n型、3n+1型、3n+2型中的一种(由数论的基本知识知:一个数 mod q,所得数值必在0到q - 1之间),N为3n型数据时,直接全部分解为3;N为3n+1型数据时,最后会出现4,对4不做分解;N为3n+2型数据时,最后会出现5,将5分解为3和2。而N能分解成[N/3]个3。
这个问题的证明如下:https://www.zhihu.com/question/30071017/answer/257494547
这个问题终于能和学过的高数知识和不等式知识联系起来了
代码如下:
就本题而言,易知,N必为 3n型、3n+1型、3n+2型中的一种(由数论的基本知识知:一个数 mod q,所得数值必在0到q - 1之间),N为3n型数据时,直接全部分解为3;N为3n+1型数据时,最后会出现4,对4不做分解;N为3n+2型数据时,最后会出现5,将5分解为3和2。而N能分解成[N/3]个3。
这个问题的证明如下:https://www.zhihu.com/question/30071017/answer/257494547
这个问题终于能和学过的高数知识和不等式知识联系起来了
代码如下:
#include <iostream> #include <cmath> #include <cstdio> using namespace std; double f(int N); //分解N的函数 int main() { int N; while (cin >> N && N) { printf ("%f\n",f(N)); } return 0; } double f(int N) //易知,N必为 3n型、3n+1型、3n+2型中的一种(由数论的基本知识知:一个数 mod q,所得数值必在0到q - 1之间) { int k = N / 3; if (N == 1) return 1; if (N % 3 == 0) // 如果N为 3n型 数据 return pow(3, k); if (N % 3 == 1) // 如果N为 3n+1型 数据 return 4.0 * pow(3, k - 1); else // 如果N为 3n+2型 数据 return 2.0 * pow(3, k); }
相关文章推荐
- 有一个正整数N可以分解成若干个正整数之和,问如何分解能使这些数的乘积最大?
- 有一个整数n,将n分解成若干个整数之和,问如何分解能使这些数的乘积最大,输出这个乘积m
- 将一个正整数拆分成若干个互不相同的正整数且乘积最大(JS)
- FOJ 1075假设x是一个正整数,它的值不超过65535(即1<x<=65535),将x分解为若干个素数的乘积。
- 给定一个正整数n,则在n所有的分解式中,求因子乘积最大的一个分解及此乘积。
- (Relax 水题1.2)POJ 1032 Parliament(将n分解成若干个互不相等的整数的和,并且是这些整数的乘积最大)
- FOJ 1075假设x是一个正整数,它的值不超过65535(即1<x<=65535),将x分解为若干个素数的乘积。
- FOJ 1075假设x是一个正整数,它的值不超过65535(即1<x<=65535),将x分解为若干个素数的乘积。
- FOJ 1075假设x是一个正整数,它的值不超过65535(即1<x<=65535),将x分解为若干个素数的乘积。
- (Relax 水题1.2)POJ 1032 Parliament(将n分解成若干个互不相等的整数的和,并且是这些整数的乘积最大)
- 将一个正整数拆分成若干个互不相同的正整数且乘积最大(JS)
- 一个正整数N,拆成任意个正整数之和,怎样使这些数的乘积最大
- 一个正整数n被分成若干个不同自然数的和,求组成n的一组自然数的最大乘积
- 作业题,编写两个类:A和B,A创建的对象可以计算两个正整数的最大公约数,B创建的对象可以计算两个数的最小公倍数,要求:B类中有一个成员变量是A类声明的对象
- poj 1032 将一个数分成几个不同的数之和,满足这些数的乘积最大。
- 把任意一个正整数分解成几个素因子的幂的乘积
- 数据库表中有重复记录,如何删除这些重复记录保留ID最大的一个信息
- 给定一个由非负整数和整数m组成的数组,可以将该数组分成m个非空的连续子数组。 写一个算法来最小化这些m个子阵列之间的最大和。
- 求一个不含0的数列(可以有正数和负数)的最大子序列乘积java
- 编写程序:从键盘上输入若干个整数(以输入-1作为结束标识),输出这些数中的最大值和最小值,要求编写一个函数实现最大值和最小值的求取。