P1553 数字反转(升级版)
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。
整数反转是将所有数位对调。
小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
百分数的分子一定是整数,百分数只改变数字部分。
输入格式
一个实数 s
输出格式
一个实数,即 s 的反转数
输入输出样例
输入
5087462
输出
2647805
输入#2
600.084
输出 #2
6.48
代码如下
#include<iostream>
#include<string>
using namespace std;
string s;
int main(){
long long pos=0,a=0,b=0,h=0;
cin>>s;
for(int i=0; i<s.size(); i++){
//找到分隔符位置
if(!(s[i]>='0' && s[i]<='9')){
pos=i;
}
}if(pos!=0){
//当分隔符存在时
for(int i=pos-1;i>=0; i--){
a=a*10+s[i]-'0';}
//处理分隔符前数据,为了去0,倒序连接输出
cout<<a<<s[pos];
for(int i=pos+1; i<s.size(); i++){
b=b*10+s[i]-'0';}
//处理分隔符后数据
while(b>0){
h=h*10+b%10;
b=b/10;
}if(pos!=s.size()-1)cout<<h; //为了防止分隔符在最后一位有输出0
}else{
//没有分隔符,直接倒序输出
for(int i=s.size()-1; i>=0; i--){
b=b*10+s[i]-'0';}
cout<<b;
}
return 0;
}
P1603 斯诺登的密码
题目描述
2013 年 X 月 X 日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机。但是,这件事情太不周密了,因为 FBI 的间谍早已获悉他的具体位置——但这不是最重要的——最重要的是如果要去委内瑞拉,那么就要经过古巴,而经过古巴的路在美国的掌控之中。
丧心病狂的奥巴马迫降斯诺登的飞机,搜查时却发现,斯诺登杳无踪迹。但是,在据说是斯诺登的座位上,发现了一张纸条。纸条由纯英文构成:Obama is a two five zero.(以 . 结束输出,只有 6 个单词+一个句号,句子开头如没有大写亦为合法)这句话虽然有点无厘头,但是警官陈珺骛发现这是一条极其重要的线索。他在斯诺登截获的一台笔记本中找到了一个 C++ 程序,输入这条句子后立马给出了相对应的密码。陈珺鹜高兴得晕了过去,身为警官的你把字条和程序带上了飞机,准备飞往曼哈顿国际机场,但是在飞机上检查的时候发现——程序被粉碎了!飞机抵达华盛顿只剩 5 分钟,你必须在这 5 分钟内编写(杜撰)一个程序,免受上司的 10000000000 m o d 10 10000000000 \bmod 10 10000000000mod10 大板。破译密码的步骤如下:
(1)找出句子中所有用英文表示的数字 ( ≤ 20 \leq 20 ≤20),列举在下:
正规:one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty
非正规:a both another first second third。为避免造成歧义,another 算作 11 处理。
(2)将这些数字平方后对 100 取模,如 00 , 05 , 11 , 19 , 86 , 99 00,05,11,19,86,99