杭电oj-1106-排序
2015-11-02 21:48
281 查看
Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
Sample Input
0051231232050775
Sample Output
0 77 12312320
思路分析:这道题题意很好理解,难的地方是怎么把这些数分离出来。主要有三种情况考虑,前边有好多连续个‘5’,中间有好多连续个‘5’,以及最后面有好多连续个‘5’。对于中间和后面有很多个‘5’的情况很好处理,只用正序循环和逆序循环找到第一个部位‘5’的位置就可以了,对于中间的‘5’,我们采用逆循环,然后当其下标为i和下标i-1的都为‘5’时,我们将下标为i的赋值为‘0’。为什么要赋值为‘0’呢?这是因为对于中间连续的‘5’我们只取第一个,将后面的改为‘0’,在逆循环计算数值时是不变的。
例如 555123455523455555
经过处理后可得到 1234500234
得到的数还是 234 1234
然后我们从最后一个补位‘5’的一直算到第一个不为‘5’的地方,每算出一个数,就将其依次存进新的数组中,然后sort排序即可
代码如下:
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
char s[1005];
long long int a[1005];
//计算10的n次方
long long int cifang(int i)
{
int sum=1;
if(i==0)
return sum;
else
{
while(i>0)
{
sum*=10;
i--;
}
return sum;
}
}
int main()
{
//字符数组初始化
memset(s,0,sizeof(s));
while(scanf("%s",s)!=EOF)
{
//新数组清零
memset(a,0,sizeof(a));
int l1;
l1=strlen(s);
int l2,l3;
//逆循环找出最后一个不为‘5’的下标
for(int i=l1-1;i>=0;i--)
if(s[i]!='5')
{
l2=i;
break;
}
//正循环找出最后一个不为‘5’的下标
for(int i=0;i<=l2;i++)
if(s[i]!='5')
{
l3=i;
break;
}
//逆循环对中间有连续个‘5’的情况进行处理
for(int i=l2;i>l3;i--)
if(s[i]=='5'&&s[i-1]=='5')
s[i]='0';
//逆循环依次进行计算
int jishu=0;//表示第几位
int k=0;//表示新数组下标
long long sum=0;//表示数值
for(int i=l2;i>=l3;i--)
{
//因为最后一个数最高位不为‘5’,所以单独讨论
if(i==l3)
{
a[k]=sum+(s[i]-'0')*cifang(jishu);
k++;
jishu=0;
sum=0;
}
//每当遇到‘5’时,表明这个数已经计算完了,放入新的数组中
if(s[i]=='5')
{
a[k]=sum;
k++;
sum=0;
jishu=0;
}
//没有遇到‘5’,表明数字没有计算完
else
{
sum+=(s[i]-'0')*cifang(jishu);
jishu++;
}
}
//对所得的数进行排序
sort(a,a+k);
//输出
for(int i=0;i<k-1;i++)
printf("%d ",a[i]);
printf("%d",a[k-1]);
printf("\n");
//字符数组初始化
memset(s,0,sizeof(s));
}
return 0;
}
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
Sample Input
0051231232050775
Sample Output
0 77 12312320
思路分析:这道题题意很好理解,难的地方是怎么把这些数分离出来。主要有三种情况考虑,前边有好多连续个‘5’,中间有好多连续个‘5’,以及最后面有好多连续个‘5’。对于中间和后面有很多个‘5’的情况很好处理,只用正序循环和逆序循环找到第一个部位‘5’的位置就可以了,对于中间的‘5’,我们采用逆循环,然后当其下标为i和下标i-1的都为‘5’时,我们将下标为i的赋值为‘0’。为什么要赋值为‘0’呢?这是因为对于中间连续的‘5’我们只取第一个,将后面的改为‘0’,在逆循环计算数值时是不变的。
例如 555123455523455555
经过处理后可得到 1234500234
得到的数还是 234 1234
然后我们从最后一个补位‘5’的一直算到第一个不为‘5’的地方,每算出一个数,就将其依次存进新的数组中,然后sort排序即可
代码如下:
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
char s[1005];
long long int a[1005];
//计算10的n次方
long long int cifang(int i)
{
int sum=1;
if(i==0)
return sum;
else
{
while(i>0)
{
sum*=10;
i--;
}
return sum;
}
}
int main()
{
//字符数组初始化
memset(s,0,sizeof(s));
while(scanf("%s",s)!=EOF)
{
//新数组清零
memset(a,0,sizeof(a));
int l1;
l1=strlen(s);
int l2,l3;
//逆循环找出最后一个不为‘5’的下标
for(int i=l1-1;i>=0;i--)
if(s[i]!='5')
{
l2=i;
break;
}
//正循环找出最后一个不为‘5’的下标
for(int i=0;i<=l2;i++)
if(s[i]!='5')
{
l3=i;
break;
}
//逆循环对中间有连续个‘5’的情况进行处理
for(int i=l2;i>l3;i--)
if(s[i]=='5'&&s[i-1]=='5')
s[i]='0';
//逆循环依次进行计算
int jishu=0;//表示第几位
int k=0;//表示新数组下标
long long sum=0;//表示数值
for(int i=l2;i>=l3;i--)
{
//因为最后一个数最高位不为‘5’,所以单独讨论
if(i==l3)
{
a[k]=sum+(s[i]-'0')*cifang(jishu);
k++;
jishu=0;
sum=0;
}
//每当遇到‘5’时,表明这个数已经计算完了,放入新的数组中
if(s[i]=='5')
{
a[k]=sum;
k++;
sum=0;
jishu=0;
}
//没有遇到‘5’,表明数字没有计算完
else
{
sum+=(s[i]-'0')*cifang(jishu);
jishu++;
}
}
//对所得的数进行排序
sort(a,a+k);
//输出
for(int i=0;i<k-1;i++)
printf("%d ",a[i]);
printf("%d",a[k-1]);
printf("\n");
//字符数组初始化
memset(s,0,sizeof(s));
}
return 0;
}
相关文章推荐
- IO流小结
- HDU 5533 Dancing Stars on Me (2015ACM/ICPC亚洲区长春 &&计算几何)
- 在做App上线打包的时候遇到的问题
- 回归
- 随机数组求和
- (转)矩阵运算
- 【读书笔记】程序员的自我修养总结(七)
- Chapter5-标准I/O库(补充)-「APUE读书笔记」
- 商业模式(二):P2P网贷平台,利差和服务费为主的金融玩法
- HDOJ 5551 Huatuo's Medicine (水)
- 商业模式(二):P2P网贷平台,利差和服务费为主的金融玩法
- 商业模式(二):P2P网贷平台,利差和服务费为主的金融玩法
- 无限轮播图
- elipse启动报错:org.eclipse.swt.SWTException: Invalid thread access
- Unity Shader:Blur
- Activity的四种加载模式
- PLAYGROUND 延时运行
- hdoj 5521 Meeting 【优先队列 dijkstra】
- 语义分析的一些方法(下篇)
- 树---判断两棵树是否相等