`
Sunnie小食
  • 浏览: 54551 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

RUC_JudgeOnline 1004 整数分解问题

阅读更多

整数分解问题

Description

有一个整数n,n可分解成若干个整数之和,问如何分解能使这些数的乘积最大。请编程,输入一个整数n(n<50),将n分解成若干个整数,输出这些数的乘积m,且要保证m是最大的。

Input

共一行,为整数n。

Output

最大的乘积m。

Sample Input

 

10

 

Sample Output

 

36

 

Source

习题6-3

 

问题分析:

对于一个整数,我们首先要知道,分解成怎样的形式才能使乘积最大。得到的结论是分成尽可能多的3,剩下的都分成2,这样可以得到最大的乘积。所以,我们程序的目的就是将输入的数N分成很多个3进行累乘。当N小于等于4时,我们就可以直接乘以N了。这是因为如果是1,2或者3显然它本身是最大的,不能把2分成1和1,或者把3分成1和2.对于4,最好的分解方法显然是2和2.但是2*2就等于4,所以,当N小于等于4的时候,我们就可以不用再分了。

解决方案:

总的来说,有两种解题思路。一个正着退,一个倒着来。也就是一个用递推,一个用递归。现在在这个程序中用递推的效率明显高于递归。详见参考程序。

参考程序(递推):

 

#include<stdio.h>

int main()
{
	int N;
 	scanf("%d",&N);
 
 	int m=1;                                  //用m表示乘积
 	while(N>4)
 	{
  		m=m+m+m;	//用加法替代乘法
  		N=N-3;
 	}
 	m=m*N;
 	printf("%d\n",m);
 	return 0;
}

 参考程序(递归):

#include<stdio.h>

int calc(int N);
int main()
{
	int N;
 	scanf("%d",&N);

 	printf("%d\n",calc(N));

 	return 0;
}

int calc(int N)
{
	if(N<=4)
	return N;
	else
	return 3*calc(N-3);
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics