设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1056|回复: 9
打印 上一主题 下一主题

这个题目怎么做

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-3 02:16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最大整数
Time Limit:1000MS Memory Limit:65536K
Total Submit:431 Accepted:115
Description
设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613

Input
n
n个数

Output
联接成的多位数
Sample Input

3
13 312 343
4
7 13 4 246
Sample Output

34331213
7424613
2#
发表于 2009-11-3 02:16:45 | 只看该作者
把输入的n个数列成一个数组,然后按从"大"到"小"排列,最后数组顺序无空格输出
重点是比较“大”“小”,举几个例子在下面:
43 < 4 = 44 < 45 < 5
454 < 45 = 4545 < 455
有时间的代码一下
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-3 02:16:48 | 只看该作者
看他们楼下的
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-3 02:16:51 | 只看该作者
ls没看懂题目
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-3 02:16:52 | 只看该作者
4个数
7 13 4 246

取它们的第一位数分别为 7 1 4 2
按从大到小排 7 4 2 1
所以答案就为 7 4 246 13
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-3 02:16:53 | 只看该作者
以下是引用kisscjy在2007-10-11 23:46:12的发言:
4个数
7 13 4 246

取它们的第一位数分别为 7 1 4 2
按从大到小排 7 4 2 1
所以答案就为 7 4 246 13
补充,如果最高位的相等就比低一位的。
回复 支持 反对

使用道具 举报

7#
发表于 2009-11-3 02:16:54 | 只看该作者
用一个一维数组存储,在每组数间用一个标志分隔(flag),每次取标志后第一个数进行大小比较,如果第一个数等大,再去第二个比较,依次类推!
当比较有结果时,进行数据调整.如果一直未比较到大小则遇到标志后结束,并删去标志位.
回复 支持 反对

使用道具 举报

8#
发表于 2009-11-3 02:16:55 | 只看该作者
能不能把你的思路说详细一点,我看不明白。谢谢!
回复 支持 反对

使用道具 举报

9#
发表于 2009-11-3 02:16:56 | 只看该作者
感觉你的这个想法很可行,但我不会处理,你能详细说一下吗? 谢谢!
回复 支持 反对

使用道具 举报

10#
发表于 2009-11-3 02:17:03 | 只看该作者
写了个程序,按照我在二楼的思路,实现了功能,效率方面没考虑过,自行优化吧。
像:最小公倍数、排序算法上改进,类接口上改进(加操作符重载、友元函数)

  1. #include <iostream>
  2. using namespace std;

  3. int sbs(int a, int b) // 最小公倍数
  4. {
  5. for (int i=max(a,b); ; ++i)
  6. if (i%a==0 && i%b==0)
  7. return i;
  8. }

  9. class Number
  10. {
  11. public:
  12. Number(){}

  13. void setvalue(int value)
  14. {
  15. for (int i=0; i<=9; ++i)
  16. _val[i] = 0; // 先将 _val[10] 每位清0

  17. int k = 10;
  18. _value = value;
  19. _n = 1;
  20. while (value/k != 0)
  21. {
  22. ++_n; // 求得 _value 的位数 _n
  23. k *= 10;
  24. }

  25. k /= 10;
  26. for (int i=0; i<= _n-1; ++i)
  27. {
  28. _val[i] = (value / k) % 10; // _value 的每位数"从左到右"存储在数组_val[10]里
  29. k /= 10;
  30. }
  31. }
  32. int getvalue()
  33. {
  34. return _value;
  35. }
  36. int getn()
  37. {
  38. return _n;
  39. }
  40. int getval(int n)
  41. {
  42. return _val[n]; // 得到第n位的数
  43. }
  44. private:
  45. int _value;
  46. int _n; // _value 的位数
  47. int _val[10]; // 各位数字存在数组里
  48. };

  49. bool isGreater(Number &a, Number &b)
  50. {
  51. for (int i=0; i<=sbs(a.getn(),b.getn())-1; ++i) // 最大比较次数为a、b位数的最小公倍数
  52. {
  53. if (a.getval(i%a.getn()) > b.getval(i%b.getn())) // 循环比较
  54. return true;
  55. else if(a.getval(i%a.getn()) < b.getval(i%b.getn()))
  56. return false;
  57. }
  58. return false;
  59. }

  60. int main()
  61. {
  62. int n;
  63. cout << "input numers: " << endl;
  64. cin >> n;
  65. getchar();

  66. int a;
  67. Number b[n];
  68. for (int i=0; i<=n-1; ++i)
  69. {
  70. cin >> a;
  71. b[i].setvalue(a);
  72. }
  73. cout << endl;

  74. for (int i=n-1; i>=1; --i) // 排序
  75. for (int j=1; j<=i; ++j)
  76. {
  77. if (isGreater(b[j], b[j-1]))
  78. {
  79. int temp = b[j].getvalue();
  80. b[j].setvalue(b[j-1].getvalue());
  81. b[j-1].setvalue(temp);
  82. }
  83. }

  84. for (int i=0; i<=n-1; ++i)
  85. {
  86. cout << b[i].getvalue();
  87. }
  88. cout << endl;
  89. return 0;
  90. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 07:34 , Processed in 0.111955 second(s), 8 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表