读书人

整型的最大递减数该如何求

发布时间: 2013-08-04 18:26:16 作者: rapoo

求一个整型的最大递减数该怎么求?
比如一个整型是9896546,他的递减数就有98,96,965,9654,654,54,最大递减数就是965,求哪位大神能用一个函数实现它


int get MaxNum(int num)
{
return 0;
}

[解决办法]
// m_IntVec是在外部申明的全局变量(vector<int> m_IntVec);
m_IntVec.clear();
for(int i = 1; i < 100000000; i= i*10)
{
if(0 == num/i)
break;
m_IntVec.push_back(num/i%10);
}// 到这是把所有的数字从个位存到m_IntVec中,算法的话暂时想不到好的。感觉可以用递归实现:每个数字在遇到大于等于自己的数字时(或者直接到末尾),计算中间有多少个数字,取出最多的(也就是位数最多),再递归,最后找到的一定是位数最多的递减数,那么自然也是最大的。比如第一次递归可得到96546,第二次递归得到9654。

[解决办法]
VS2010完美运行+正确结果,欢迎改进算法,楼主试下!
#include "stdafx.h"
#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <stdarg.h>
#include <cctype>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
int max=0,t=0,i=0;
string str="9896546";
vector<int> vec;
vector<int> temp;
vector < int >::iterator stvec;
vector < int >::iterator sttemp;
for (i=0;i!=str.size();++i)
{
int j=0;
vec.clear();
vec.push_back((str[i]-48));
if((i+1)==str.size())
{
for(sttemp=temp.begin();sttemp!=temp.end();++sttemp)
{
cout<<*sttemp;
}
cout<<endl;
return 0;
}
else
{
while(str[i]>str[i+1])
{
i++;
vec.push_back((str[i]-48));
j++;
}
i=i-j;
if(j==0)
{
vec.clear();
}
else
{
if(max<j)
{
max=j;
temp=vec;
}
else if(max==j)
{
stvec=vec.begin();
sttemp=temp.begin();
do
{
if((*stvec)<=(*sttemp))
{
++stvec;
++sttemp;
continue;


}
else
{
temp=vec;
break;
}
}while(stvec!=temp.end());
}
}

}

}

}


[解决办法]
补充:将整型数转换为字符串
int num=9896546;
char buf[10];
string str;
itoa(num,buf,10);
str=buf;

[解决办法]
引用:

int maxDecNum(int n)
{
int a[10]={0}
int d=0;
int m = n;
while(m>=10)
{
d = m %10;
a[d]++;
m /=10;
}
a[m]++;
m =0;
for(int i=9;i>=0;i++)
{
if(a[i]) {
m *= 10;
m += i;
}
}
return m;
}

别人的要求是连续的,你这个根本就不是连续的。
[解决办法]
原来你要的是最长连续递减子序列。
代码在这里:

int maxLenDecSq(char a[],int n,int &pos)
{
int len =1;
int maxlen=1,maxpos=0;
int startpos=0;
int i;
for(i=1;i<n;i++)
{
if(a[i]<a[i-1])len++;
else {
if(maxlen<len) {
maxlen=len;
maxpos =startpos;
}
len=1;
startpos =i;
}
}
if(maxlen<len) {
maxlen=len;
maxpos =startpos;
}
pos = maxpos;
return maxlen;
}
int maxDecSqNum(int n){


char s[80];
itoa(n,s,10);
int pos=0;
int len =maxLenDecSq(s,strlen(s),pos);
s[pos+len]='\0';
return atoi(s+pos);
}


如果不连续,另外处理
[解决办法]
#include <iostream>
using namespace std;


int getMaxNum(int num){
int digits[20];
int n = 0;
while(num){
digits[n++] = num % 10;
num /= 10;
}
int maxv = 0;
for(int i = n - 1; i >= 0; ){
int tv = 0, j = i;
maxv = max(maxv, digits[i]);
while(j > 0 && digits[j] > digits[j - 1]){
tv = tv * 10 + digits[j];
--j;
}
i = j - 1;
maxv = max(maxv, tv);
}
return maxv;
}
int main(){
int n;
while(~scanf("%d", &n)){
cout << getMaxNum(n) << endl;
}
return 0;
}

[解决办法]
#include <stdio.h>
int getMaxNum(int num)
{
int MaxNum = 0;//最大数
int Maxtmp = 0;//正在生成的最大数
int frontkey = 0;//上一位的值
int roundkey = 0;//这一位的值
int i = 1;//位数指示标志 ,初始化为个位
if(num < 0) num = -num;
do{
if((roundkey=num%10) >= frontkey){
Maxtmp += roundkey*i ;//生成第(i/10)位
i*=10;//位数+1
}else{
MaxNum = Maxtmp>MaxNum?Maxtmp:MaxNum;//取最大MaxNum


Maxtmp = roundkey;//初始化Maxtmp个位
i = 10;//初始化i指向十位
}
frontkey = roundkey;
num/=10;
}while(num!=0);
return Maxtmp>MaxNum?Maxtmp:MaxNum ;
}

读书人网 >C++

热点推荐