
正文
java代码最大k乘积 java计算最大值
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
动态规划最大K乘积问题
设I是一个n位十进制整数。如果将I分割为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。
测试:
输入: 2 1 (2是位数,1是分几段)
15 (15是I)
输出:15
输入: 5 2
12345
输出:6170
相关问答
Q1: 编程,输入7个自然数组成两个整数,求这两个数乘积的最大值与最小值
#includestdio.h
#includemath.h
void main(void)
{
int a[7] = {0};
int i;
int j;
int k;
int temp;
printf("请输入7个0至9的整数:\n");
for(i=0; i7; i++)
scanf("%d", a+i);
for(i = 7/2;i=1;i/=2)
{ for(k=0;k7;k++)
for(j=0;j7-i;j++)
if(a[j]a[j+i])
{
temp = a[j];
a[j] = a[j+i];
a[j+i] = temp;
}
}
k = j = 0;
for(i=0; i7; i++)
{
if(i4)
k+=a[i]*(int)pow(10, 4-i-1);
else
j+=a[i]*(int)pow(10, 6-i);
}
printf("最大值为:%d ", k*j);
k = j = 0;
for(i=6;i=0; i--)
{
if(i2)
k+=a[i]*(int)pow(10, i-3);
else
j+=a[i]*(int)pow(10, i);
}
printf("最小值为%d\n", k*j);
}
Q2: java求前k个最大数1秒内循环10000次
问题描述java代码最大k乘积:求一个数组java代码最大k乘积的最大k个数java代码最大k乘积,如,{1,5,8,9,11,2,3}的最大三个数应该是,8,9,11
问题分析:
1.解法一:最直观的做法是将数组从大到小排序,然后选出其中最大的K个数,但是这样的解法,复杂度是O(logn*n),但是有时候并不需要排序,用简单的选择排序,或者是冒泡排序,那么就K轮的交换或者是选择,就可以得出结论,复杂度是O(n*k),当K很大的时候排序可能是更好的解法,当K小的时候用选择或者是冒泡效率会更加的高。但是这都是会对前K个数进行排序,所以效率不高,当K很大的时候,以上两种方法效率都不是很高。
2.解法二:不对前K个数进行排序,回忆快排的算法中,那个partition函数,就是随机选择数组中的一个数,把比这个数大的数,放在数组的前面,把比这个数小的数放在数组的
后面,这时想如果找出的随机数,最终位置就是K,那么最大的K个数就找出来了,沿着这个思路思考问题,但是这个函数,最后的索引位置并不一定是K,可能比K大也可能比K小,我们把找出的数组分成两部分sa,sb,sa是大的部分,sb是小的部分,如果sa的长度等于K的话,那么直接返回就是最终结果,如果sa的长度要比K大的话,那么以sa为新的数组,从sa中找出K个最大的数,这时候就把原始数据集减少到的sa,如果sa的长度比K小的话,加入sa中有m个元素,那么m个元素算作是K中元素的一部分,再从sb中找到,k-m个最大的元素,组合起来就是最终的结果,那么这时把问题简化成从sb中找k-m个最大的元素,所以总体来说这是一个递归的过程,虽然复杂大也是O(n*logn)但是,每一次数据量都会减少所以会更加的快。
3.解法三:是利用堆排序,建立一个K阶最大堆,然后数据一个个插入队当中,那么插入队的时间复杂度是O(logK),适合数据量比较大的时候,用堆的效果更加好。
Q3: java排序问题 一组偶数个数据,重排,使得前半部分和后半部分的和的乘积最大
public class MaoPao
{
public static void main(String args[])
{
int[] arr={2,1,3,4,6,5,7,8,9,0,10};
//N是数组的元素个数,这样无论多少个数,直接修改arr中的元素就行了,
//不需要调整循环次数
int N = arr.length;
int temp=0;
//冒泡排序:每次把最大的放到最后,N-i是因为第i次排序之后,
//数组arr的最后i个数已经是按照大小顺序的了,所以不需要再排序了
//比如第一次排序之后,最后一个数肯定是最大的,下一次只需要排前9个就行了。
for(int i=1;iN;++i)
{
for(int j=0;jN-i;++j)
{
//如果前面的数比后面的大,则不是按照顺序的,因此要交换
if(arr[j]arr[j+1])
{
temp=arr[j]; //交换2个数
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for(int i=0;iN;++i) //输出排序后的结果
{
System.out.print(arr[i]+" ");
}
}
}
Q4: 最大K乘积问题
蓦然发现这个小题挺好玩java代码最大k乘积,我这里写java代码最大k乘积了个程序可以实现对任意长度(这里限制最大50个byte)数字串求最大k乘积
使用递归算法,要注意java代码最大k乘积的是在得到一个k乘积时置一个全局变量为真,以便返回上一级递归调用后,将temp存储java代码最大k乘积的数字回溯到前一状态。
java代码最大k乘积你可以考虑用树来实现,我这里用了vector来实现的
#include iostream
#include vector
#include string.h
using namespace std;
#define BUFFERSIZE 50
char num[BUFFERSIZE]={0};
vectorstring temp;
vectorstring result;
double KProduct=0;
bool getAKproduct=false;
void kproduct(char* s, int n,int k)
{
vectorstring::iterator p;
if(n0 k==1)//get a kproduct
{
getAKproduct=true;
temp.push_back(s);
double product=1;
for (p=temp.begin(); p!=temp.end(); p++)
{
product *= atoi((*p).c_str());
}
if(product KProduct)
{
KProduct = product;
result.clear();
result=temp;
}
}
else
{
for(int i=1; i=n-k+1; i++) //i 取第一个数的长度
{
if(getAKproduct)
{
int poplength=0;
for(p=temp.end()-1; poplength!=n; temp.pop_back(),p=temp.end()-1)
{poplength += (*p).size();}
getAKproduct=false;
}
char *tmp=new char[BUFFERSIZE];
memset(tmp,0,BUFFERSIZE);
for(int j=0; ji; j++)
{
if (tmp[0]==0)
tmp[0]=*(s+j);
else
tmp[strlen(tmp)] = *(s+j);
}
temp.push_back(tmp);
kproduct(s+i,n-i,k-1);
}
}
}
void main()
{
int k=0,n=0;
cout"input num and K:\n";
cinnumk;
if (num[0]=='0')
{
cout"Be sure a number should begin with non 0\n";
return;
}
n = strlen(num);
if (n k)
{
coutnum" does not have a "k" product!";
return;
}
if(n BUFFERSIZE)
{
cout"Buffer overload,size="BUFFERSIZEendl;
return;
}
kproduct(num,n,k);
coutnum"'s max kproduct is ";
for(vectorstring::iterator p=result.begin(); p!=result.end(); p++)
{
cout(*p).c_str();
if (p==result.end()-1)
cout" = ";
else
cout"*";
}
coutKProductendl;
}
java代码最大k乘积的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java计算最大值、java代码最大k乘积的信息别忘了在本站进行查找喔。







