http://www.diybl.com/course/3_program/c++/cppjs/2008912/142137.html
题目:
给定一个正整数n,则在n所有的分解式中,求因子乘积最大的一个分解及此乘积。
n=5时,有如下分解式:
5=5
5=4+1
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
在这些分解式中,3*2=6最大,这就是所要求的结果。
若n = 12,最大为3*3*3*3 = 81。
解法:
这一题冒失需要穷尽所有的分解式,其实不然,通过分析数据可得出如下假设:
对任意一个正整数x>3,有i=x/3,j=x%3, 设S为分解式乘积最大的数
当 j=0 时 s=3的i次方
当 j=1 时 s=3的(i-1)次方*4
当 j=2 时 s=3的i次方*2
证明:
首先我们证明将x分为3和2的组合得到的s最大
1)首先证明当3<x<10时满足
x=4 2*2=4
x=5 3*2=6
x=6 3*3=9
x=7 3*2*2=12
x=8 3*3*2=18
x=9 3*3*3=27
x=10 3*3*2*2=36
2)
假设x>10,且x=a[0]+...a[k]时s最大,且a[i]不等于2和3
若a[i]>10,假设a[i]=10*l+m (m<10),明显可知 若将a[i]分解为 l个10相加再加上m 得到的乘积为(10的l次方*m)不小于 a[i]。所有a[]中不可能存在大于10的数
若0<a[i]<10 由(1)可知 将a[i]分解为 2,3的组合得到的s'>=s
由此可以证明 将整数x 分解为2,3的组合 得到的s最大
又因为
3+3=2+2=2
3*3=9 > 2*2*2=8
所有若出现3个2就应该转换为两个3
代码如下:
public static long calculate(long value) {
long result = -1;
if (value == 1 || value == 0)
result = 0;
else if (value == 2)
result = 1;
else if (value >= 3) {
long i = value / 3;
long j = value % 3;
switch ((int)j) {
case 0:
result = (long) Math.pow(3, i);
break;
case 1:
result = (long) (Math.pow(3, i - 1) * 4);
break;
case 2:
result = (long) (Math.pow(3, i) * 2);
}
}
return result;
}
运行结果:
n=1,result=0 |
n=2,result=1 |
n=3,result=3 |
n=4,result=4 |
n=5,result=6 |
n=6,result=9 |
n=7,result=12 |
n=8,result=18 |
n=9,result=27 |
n=10,result=36 |
n=11,result=54 |
n=12,result=81 |
n=13,result=108 |
n=14,result=162 |
n=15,result=243 |
n=16,result=324 |
n=17,result=486 |
n=18,result=729 |
n=19,result=972 |
n=20,result=1458 |
n=21,result=2187 |
n=22,result=2916 |
n=23,result=4374 |
n=24,result=6561 |
n=25,result=8748 |
n=26,result=13122 |
n=27,result=19683 |
n=28,result=26244 |
n=29,result=39366 |
n=30,result=59049 |
n=31,result=78732 |
n=32,result=118098 |
n=33,result=177147 |
n=34,result=236196 |
n=35,result=354294 |
n=36,result=531441 |
n=37,result=708588 |
n=38,result=1062882 |
n=39,result=1594323 |
n=40,result=2125764 |
n=41,result=3188646 |
n=42,result=4782969 |
n=43,result=6377292 |
n=44,result=9565938 |
n=45,result=14348907 |
n=46,result=19131876 |
n=47,result=28697814 |
n=48,result=43046721 |
n=49,result=57395628 |
n=50,result=86093442 |
n=51,result=129140163 |
n=52,result=172186884 |
n=53,result=258280326 |
n=54,result=387420489 |
n=55,result=516560652 |
n=56,result=774840978 |
n=57,result=1162261467 |
n=58,result=1549681956 |
n=59,result=2324522934 |
n=60,result=3486784401 |
n=61,result=4649045868 |
n=62,result=6973568802 |
n=63,result=10460353203 |
n=64,result=13947137604 |
n=65,result=20920706406 |
n=66,result=31381059609 |
n=67,result=41841412812 |
n=68,result=62762119218 |
n=69,result=94143178827 |
n=70,result=125524238436 |
n=71,result=188286357654 |
n=72,result=282429536481 |
n=73,result=376572715308 |
n=74,result=564859072962 |
n=75,result=847288609443 |
n=76,result=1129718145924 |
n=77,result=1694577218886 |
n=78,result=2541865828329 |
n=79,result=3389154437772 |
分享到:
相关推荐
正整数n的这种表示称为正整数n的划分。求正整数n的不同划分个数。 例如正整数6有如下11种不同的划分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+1。 Input ...
大于1 的正整数n可以分解为:n=X1*X2*…*Xm。 例如,当n=12 时,共有8 种不同的分解式: 12=12; 12=6*2; 12=4*3; 12=3*4; 12=3*2*2; 12=2*6; 12=2*3*2; 12=2*2*3。 编程任务: 对于给定的正整数n...
在Keil下编写的单片机正整数加法器,支持多个正整数相加。
大于1 的正整数n可以分解为:n=x1*x2*…*xm。 例如,当n=12 时,共有8 种不同的分解式: 12=12; 12=6*2; 12=4*3; 12=3*4; 12=3*2*2; 12=2*6; 12=2*3*2; 12=2*2*3。 编程任务: 对于给定的正整数n,编程...
对于给定的n位正整数a 和正整数k,设计一个算法找出剩下数字组成的新数 最小的删数方案。 «编程任务: 对于给定的正整数a,编程计算删去k个数字后得到的最小数。 Input 由文件input.txt提供输入数据。文件的第1...
计算机编程题目:判断输入的任何一个正整数n,是否等于某个连续正整数序列之和。(要求多次输入直到碰到输入的数字小于1时程序退出。) C++语言编写的代码
C语言程序设计-求给定正整数n以内的素数之积;(n).c
题目描述 设有n个正整数,将他们连接成一排,组成一个...有多组测试样例,每组测试样例包含两行,第一行为一个整数N(N),第二行包含N个数(每个数不超过1000,空格分开)。 输出描述: 每组数据输出一个表示最大的整数。
求满足1+2+3+…n的最大正整数n的MATLAB程序
分析:求解k个数的不同组合,我们可以用一维数组a[0]~a[k-1]来保存其中的一个结果,因为组合...所以a[k-1]即组合中的最后一个数,只能为k~n 令i=a[k-1] 则 i>=k && i<=n 完整代码请参考我的博客文章,这里只是核心部分
证明:对任意正整数n,都存在连续n个正整数,它们都是合数.pdf
大整数加法代码,用C语言实现大整数的加法、减法、乘法、除法。
求两个正整数m、n的最大公约数 Java语言实现
题目1:设 n 为一自然数,n 可以分解成若干个不同的自然数的和,这样的分法有很多种,比如 n=10, 10 可以分解为:10=5+4+1;... 从一个由 k 位数字构成的正整数 n 中删除 m(m)位数字,使删除后的数最大。
给定一个十进制正整数N,程序输出从1到N的所有整数中,“1”出现的个数。C语言程序附带实验报告
正整数无序分拆算法设计及论证,如果错误请指正。
输入计算出的分解式的数目
输入两个正整数m和n,求其最大公约数和最小公倍 数。
给定n位正整数a,去掉其中任意k个数字后,剩下的数字按原次序排列成一个新的正整数。 算法设计: 给定n (1<=n)位的正整数a和k,此时,k小于n。 试着设计一个算法,找出删去k个数,剩下数字组成的新数最小的删数...
将一个整数字符串用*分隔成k段后,将每段数字相乘得到的最大乘机