题目描述:
输入不限长度的字符数字,经过函数处理,输出的数字为最小值,其中0在开头无效。
例:
输入 026148
输出 102468
这是一开始想到的方法,最初的版本没有考虑到数字不限长度的问题,这里就不附上了。
主要思想就是字符串转换成数字,排序,再把数字转换成字符串输出(如果以数字形式输出,就不满足限长度的要求)
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main()
{
cout << "please input the number:" << endl;
string str;
cin >> str;
int str_length = str.length();
int *a = new int[str_length];
for(int i=0; i < str_length; i++ )
{
a[i] = str[i] - '0';
}
int k = str_length;
//排序
for (int i = 0; i < k; i++)
{
for (int j = i; j < k; j++)
{
if (a[i] > a[j])
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
//找出第一个非零的数
int nozero = -1;
for(int i = 0; i < k; i++)
{
if(a[i]!=0)
{
nozero = i;
break;
}
}
if(nozero!=-1)
{
int temp = a[0];
a[0] = a[nozero];
a[nozero]= temp;
}
ostringstream oss;
string c;
string d;
for(int i=0; i<k ; i++)
{
oss<<a[i];
c = oss.str();
d+=c;
}
cout << c;
delete []a;
getchar();
getchar();
}
最好最快的方法:
直接字符串的字符可以比较大小,不必转换成数字再比较大小
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a;
cin >> a;
int k = a.length();
//排序
for (int i = 0; i < k; i++)
{
for (int j = i; j < k; j++)
{
if (a[i] > a[j])
{
swap(a[i],a[j]);
}
}
}
//找出第一个非零的数
int nozero = -1;
for(int i = 0; i < k; i++)
{
if(a[i]!='0')
{
nozero = i;
break;
}
}
if(nozero!=-1)
{
swap(a[0],a[nozero]);
}
cout << a;
getchar();
getchar();
}