2016普及组模拟考试 01题
2016-09-05 13:08
204 查看
笨笨玩游戏(game.cpp)
【题目描述】
一天,笨笨和妈妈玩游戏,妈妈 给笨笨出N个正整数,让笨笨把这N个正整数连接生成一个“大”的整数,每个正整数只使用一次,让笨笨告诉妈妈这样生成的大整数的最大值。
例如,给出4个整数:123, 124, 56, 90,可以连接生成的大整数有:1231245690, 1241235690, 5612312490, 9012312456, 9056124123等等,对本例,总共可以生成24个大整数。而其实最大整数是:9056124123
【输入】
第1行:1 个整数N(1<=N<=50)
第2行:N个整数,每个整数不超过INT_MAX。
【输出】
第1行:生成的最大整数。
【样例输入】
4
123 124 56 90
【样例输出】
9056124123
分析:
其实这道题就是把各个数排序之后输出,初看到这道题想当然就以为用strcmp比较,然而字典序排出来后连接是错的。。
然而当初根本就没测数据就交了,果然不能太自大,后来找到一组数据
3
9
91
123
然而它输出了919123!不是应该991123吗,哦9的字典序比91小
怎么解决这个问题呢,既然排序的时候不能直接单独比字典序,那么比较两个数的时候,就把它俩连起来,就生成两个串
再比较两个串的大小不就好了?
把数字转为字符可以用sprintf,连接两个字符串可以用strcat
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; bool xmy(int a,int b) { char x[20],y[20],q[20],w[20]; sprintf(x,"%d",a);sprintf(y,"%d",b); strcpy(q,x);strcpy(w,y); strcat(q,y);strcat(w,x); if(strcmp(q,w)<0) return 1; return 0; } int a[53],n,i; char s[1000],p[20]; int main() { freopen("game.in","r",stdin); freopen("game.out","w",stdout); scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n,xmy); for(i=n-1;i>=0;i--) { memset(p,0,sizeof(p)); sprintf(p,"%d",a[i]); strcat(s,p); } puts(s); }
相关文章推荐
- 日期类
- 一篇介绍PHP集成服务器Wamp安装,使用的文章
- 互联网协议入门(一) 作者:阮一峰
- 关于Chrome即谷歌调试工具的使用
- 【NOIP】提高组2012 借教室
- 手机卫士项目
- 复数类
- vmware ubuntu 新增硬盘方法
- SQL2005中的事务与锁定(六) - 转载
- 菜单栏的创建
- Acure学习
- Java String 字符串
- 【ImageLoader】Universal-Image-Loader学习系列(二),ImageLoaderConfiguration的使用
- ld: symbol(s) not found for architecture i386
- 注释转换
- Linux 使用 iptables屏蔽IP段
- Freeswitch环境搭建及pstn网络呼出电话备忘
- 【ImageLoader】Universal-Image-Loader学习系列(一),下载及简单的使用
- 公网IP、私网IP
- sss