n个正整数联接成一排,组成一个最小的多位整数
2017-02-22 07:11
190 查看
题目描述:
设有n个正整数,将它们联接成一排,组成一个最小的多位整数。
程序输入:n个数
程序输出:联接成的多位数
例如:
n=2时,2个整数32,321连接成的最小整数为:32132,
n=4时,4个整数55,31,312, 33 联接成的最小整数为:312313355
[题目要求]
1. 给出伪代码即可,请给出对应的文字说明,并使用上面给出的例子试验你的算法。
2. 给出算法的时间空间复杂度。算法的时间复杂度为O(nlogn),空间复杂度为O(n)。
3. 证明你的算法。(非常重要)使用插入排序的思路证明。
// 两种方法
#define METHOD1
#ifdef METHOD1
#include "ds.h"
using namespace std;
char *itoa(int num,char *str,int radix)
{
char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
unsigned unum; /* 中间变量 */
int i = 0, j, k;
/* 确定unum的值 */
if (radix == 10 && num < 0) /* 十进制负数 */
{
unum = (unsigned)-num;
str[i++] = '-';
}
else /* 其他情况 */
{
unum = (unsigned)num;
}
/* 逆序 */
do {
str[i++] = index[unum%(unsigned)radix];
unum /= radix;
}while (unum);
str[i] = '\0';
if (str[0] == '-')
k = 1;
else
k = 0;
for (j = k; j <= (i-1)/2.0 + k; j++)
{
num = str[j];
str[j] = str[i-j-1+k];
str[i-j-1+k] = num;
}
return str;
}
int compare(const void *elem1, const void *elem2)
{
int a1 = *((int*)(elem1));
int a2 = *((int*)(elem2));
char str1[10] = {'\0'};
char str2[10] = {'\0'};
itoa(a1, str1, 10);
itoa(a2, str2, 10);
char *first = (char*)malloc(20);
char *second = (char*)malloc(20);
strcpy(first, str1);
strcat(first, str2);
strcpy(second, str2);
strcat(second, str1);
return strcmp(first, second);
}
int main()
{
int a[4] = {55, 31, 312, 33};
qsort(a, 4, sizeof(int), compare);
for (int i = 0; i < 4; i++)
printf("%d_",a[i]);
printf("\n");
}
#else
#include <vector>
#include <iostream>
#include <sstream>
#include <cmath>
#include <iterator>
#include <algorithm>
#include <string>
using namespace std;
//自定义的排序方法
bool compare_num(long x, long y)
{
static stringstream ss;
ss.clear();
ss<<x<<" "<<y;
string str_x, str_y;
ss>>str_x>>str_y;//这里把两个数转换成string,以便于获取长度,从而计算出需要乘以10的多少次方
return (x * powl(10, str_y.length()) + y) < (y * powl(10, str_x.length()) + x);
}
int main(int argc, char **argv)
{
long x[] = {55, 31, 312,33};
sort(x, x + 4, compare_num);//用自定的排序方法排序
copy(x, x + 4, ostream_iterator<long>(cout));//将数组用迭代方式逐个拷贝到输出流。
//可以用cout<<x[0]<<x[1]<<x[2];来代替上面的方法。
return 0;
}
#endif
设有n个正整数,将它们联接成一排,组成一个最小的多位整数。
程序输入:n个数
程序输出:联接成的多位数
例如:
n=2时,2个整数32,321连接成的最小整数为:32132,
n=4时,4个整数55,31,312, 33 联接成的最小整数为:312313355
[题目要求]
1. 给出伪代码即可,请给出对应的文字说明,并使用上面给出的例子试验你的算法。
2. 给出算法的时间空间复杂度。算法的时间复杂度为O(nlogn),空间复杂度为O(n)。
3. 证明你的算法。(非常重要)使用插入排序的思路证明。
// 两种方法
#define METHOD1
#ifdef METHOD1
#include "ds.h"
using namespace std;
char *itoa(int num,char *str,int radix)
{
char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
unsigned unum; /* 中间变量 */
int i = 0, j, k;
/* 确定unum的值 */
if (radix == 10 && num < 0) /* 十进制负数 */
{
unum = (unsigned)-num;
str[i++] = '-';
}
else /* 其他情况 */
{
unum = (unsigned)num;
}
/* 逆序 */
do {
str[i++] = index[unum%(unsigned)radix];
unum /= radix;
}while (unum);
str[i] = '\0';
if (str[0] == '-')
k = 1;
else
k = 0;
for (j = k; j <= (i-1)/2.0 + k; j++)
{
num = str[j];
str[j] = str[i-j-1+k];
str[i-j-1+k] = num;
}
return str;
}
int compare(const void *elem1, const void *elem2)
{
int a1 = *((int*)(elem1));
int a2 = *((int*)(elem2));
char str1[10] = {'\0'};
char str2[10] = {'\0'};
itoa(a1, str1, 10);
itoa(a2, str2, 10);
char *first = (char*)malloc(20);
char *second = (char*)malloc(20);
strcpy(first, str1);
strcat(first, str2);
strcpy(second, str2);
strcat(second, str1);
return strcmp(first, second);
}
int main()
{
int a[4] = {55, 31, 312, 33};
qsort(a, 4, sizeof(int), compare);
for (int i = 0; i < 4; i++)
printf("%d_",a[i]);
printf("\n");
}
#else
#include <vector>
#include <iostream>
#include <sstream>
#include <cmath>
#include <iterator>
#include <algorithm>
#include <string>
using namespace std;
//自定义的排序方法
bool compare_num(long x, long y)
{
static stringstream ss;
ss.clear();
ss<<x<<" "<<y;
string str_x, str_y;
ss>>str_x>>str_y;//这里把两个数转换成string,以便于获取长度,从而计算出需要乘以10的多少次方
return (x * powl(10, str_y.length()) + y) < (y * powl(10, str_x.length()) + x);
}
int main(int argc, char **argv)
{
long x[] = {55, 31, 312,33};
sort(x, x + 4, compare_num);//用自定的排序方法排序
copy(x, x + 4, ostream_iterator<long>(cout));//将数组用迭代方式逐个拷贝到输出流。
//可以用cout<<x[0]<<x[1]<<x[2];来代替上面的方法。
return 0;
}
#endif
相关文章推荐
- n个正整数,联接成一排,组成一个最小(最大)的多位整数
- n个正整数联接成一排,组成一个最小的多位整数
- 设有n个正整数,将它们联接成一排,组成一个最小的多位整数
- n个正整数,联接成一排,组成一个最大(最小)的多位整数 python
- java题: 设有n个正整数,将它们联接成一排,组成一个最大的多位整数。例如:N=3时,3个整数13、312、343联成的最大整数为:34331213;
- 设有n个正整数,将他们连接成一排,组成一个最小的多位整数
- Java实现:n个正整数,将它们连接成一排,组成一个最大的多位整数。(输入:n(n个整数),依次输入n个整数)
- 求n个正整数连接成一排,组成一个最大的多位整数
- 设有n个正整数,将他们连接成一排,组成一个最大的多位整数
- 设有n个正整数,将他们连接成一排,组成一个最大的多位整数。
- 设有n个正整数,将他们连接成一排,组成一个最大的多位整数
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 设有n个正整数 (n<=20), 将它们连接成一排, 组成一个最大的多位整数
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。例如,a=13243221,k=5,输出:12
- 输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对所给的n和s,寻找一种方案使得剩下的数字组成的新数最小。
- 陈利人 面试题 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。
- 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。