华为模拟题二求一个int型整数的两种递减数之和

来源:互联网 发布:怀孕37周b超标准数据 编辑:程序博客网 时间:2024/05/20 04:15

给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数;2.递减数中各位数之和最大的数)之和。

递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的数位大小相同的情况。

最大递减数:所输入整数的所有递减数中值最大的一个。 如: 75345323,递减数有:75,753,53,53,532,32。那么最大的递减数为753。

各位数字之和最大的递减数: 如75345323中的各递减数:75各位数之和=12(7+5=12),753各位数之和=15(7+5+3=15),53各位数之和=8(5+3=8),532各位数之和=10(5+3+2=10),32各位数之和=5(3+2=5)。那么各位数字之和最大的递减数为753。

#include<iostream>#include<string>#include<cstdlib>#include<vector>#include<cmath>#include<map>#include<algorithm>using namespace std;int main(){int val;char sval[32];cin>>val;if (val<0){val=-val;}if (abs(val)<10){cout<<0<<endl;return 0;}_itoa(val,sval,10);int len=strlen(sval);vector<int> denum;vector<int> gesum;    multimap<int,int> mi;for (int i=0;i<len-1;i++){vector<int> vi;for (int j=i;j<len;j++){if (sval[j]>sval[j+1]){vi.push_back(sval[j]-'0');}else{if (i!=j){vi.push_back(sval[j]-'0');}break;}}for (int k=0;k<vi.size();k++){int times=vi.size()-1-k;for (int l=0;l<times;l++){int sum=0;int gsum=0;int index=k;int e=l+1;for (int h=0;h<=(l+1);h++){sum+=vi[index]*pow(10.0,(int)e);gsum+=vi[index];e--;index++;}denum.push_back(sum);gesum.push_back(gsum);mi.insert(make_pair(gsum,sum));}}vi.clear();}sort(denum.begin(),denum.end());sort(gesum.begin(),gesum.end());int m2=gesum[gesum.size()-1];multimap<int,int>::iterator it=mi.begin();while (it->first!=m2){++it;}int m3=it->second;int summax=denum[denum.size()-1]+m3;cout<<summax;cout<<endl;return 0;}

输出结果=最大递减数+各位数之和最大的递减数。(1506=753+753)

0 0
原创粉丝点击