点我看题目

题意 : 给你一个字符串,让你按照给定规则进行处理。

  • 如果字符串里有字母或者是数字就忽略非字符数字,如果没有,就让最右边的那个字符+1.
  • 增量都是从最右边的字母或者数字开始的。
  • 增加一个数字的方法是加1到另一个数字('0' -> '1', '1' -> '2' ... '9' -> '0')。
  • 增加一个大写字母的方法是加一位到另一个字母 ('A' -> 'B', 'B' -> 'C' ... 'Z' -> 'A')。
  • 增加一个小写字母的方法是加一位到另一个字母('a' -> 'b', 'b' -> 'c' ... 'z' -> 'a')。
  • 如果增加到了9或者z或者Z,就需要进位,进给它左边离它最近的字母或者数字
  • 如果进位的时候前边没有字母或者数字了,就在这位的前边加一位,例如9进位之后要变为0,前边要加一个1,A前边加一个A,a前边加一个a。

思路 : 就是一个模拟,用string中的insert非常方便也不容易错,我比完赛之后脑抽了一下,想用普通的方法去写,结果改了好几天。。。。。T_T......郁闷啊

insert版的

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <ctype.h>
#include <algorithm> using namespace std ; string ch ; int judge1(int n)
{
for(int i = n ; i >= ; i--)
{
if(isalnum(ch[i]))
return ;
}
return ;
}
void carry(int len)
{
for(int i = len ; i >= ; i--)
{
if(isalnum(ch[i]))
{
if(ch[i] == '')
{
ch[i] = '' ;
if(i == || judge1(i-))
ch.insert(i,"") ;
else carry(i-) ;
}
else if(ch[i] == 'z')
{
ch[i] = 'a' ;
if(i == || judge1(i-))
{
ch.insert(i,"a") ;
}
else carry(i-) ;
}
else if(ch[i] == 'Z')
{
ch[i] = 'A' ;
if(i == || judge1(i-))
{
ch.insert(i,"A") ;
}
else carry(i-) ;
}
else ch[i]++ ;
return ;
}
}
}
int main()
{
int T,n ;
scanf("%d",&T) ;
while(T--)
{
cin>>ch>>n ;
for(int i = ; i < n ; i++)
{
if(!judge1(ch.size()-)) carry(ch.size()-) ;
else
ch[ch.size()-]++ ;
cout<<ch<<endl ;
}
printf("\n") ;
}
return ;
}

普通for循环的

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <algorithm> using namespace std ; int len1;
char ch[],ch1[] ; int judge(char sh)
{
if((sh >= ''&&sh <= '')||(sh >= 'A'&&sh <= 'Z')||(sh >= 'a' && sh <= 'z'))
return ;
return ;
}
int judge1(int n)
{
for(int i = n ; i >= ; i--)
{
if(judge(ch[i]))
return ;
}
return ;
}
void carry(int len)
{
int k ;
for(int i = len ; i >= ; i--)
{
if(judge(ch[i]))
{
if(ch[i] == '')
{
ch[i] = '' ;
if(i == || judge1(i-))
{
for(k = len1 ; k >= i ; k--)
ch[k+] = ch[k] ;
ch[i] = '' ;
len1++;
}
else carry(i-) ;
}
else if(ch[i] == 'z')
{
ch[i] = 'a' ;
if(i == || judge1(i-))
{
for(k = len1 ; k >= i ; k--)//一开始是从前往后移,但是都被覆盖了,是我没想到
ch[k+] = ch[k] ;
len1++;
}
else carry(i-) ;
}
else if(ch[i] == 'Z')
{
ch[i] = 'A' ;
if(i == || judge1(i-))
{
for(k = len1 ; k >= i ; k--)
ch[k+] = ch[k] ;
len1++;
}
else carry(i-) ;
}
else ch[i]++ ;
return ;
}
}
}
int main()
{
int T,n ;
scanf("%d",&T) ;
while(T--)
{
memset(ch,,sizeof(ch));
scanf("%s %d",ch,&n) ;
for(int i = ; i < n ; i++)
{
len1 = strlen(ch) ;//一开始len用的是局部变量,但是当从Z变成AA的时候长度没有跟着变,所以就改成了全局
if(!judge1(len1-)) carry(len1-) ;
else ch[len1-]++ ;
cout<<ch<<endl ;
}
printf("\n") ;
}
return ;
}

ZOJ 3490 String Successor的更多相关文章

  1. ZOJ 3490 String Successor(模拟)

    Time Limit: 2 Seconds Memory Limit: 65536 KB The successor to a string can be calculated by applying ...

  2. ZOJ 3490 String Successor 字符串处理

    一道模拟题,来模拟进位 暴力的从右往左扫描,按规则求后继就好了.除了Sample已给出的,还有一些需要注意的地方: 9的后继是10,而不是00: (z)的后继是(aa),而不是a(a): 输入虽然最长 ...

  3. ZOJ——String Successor(字符串模拟题目)

    ZOJ Problem Set - 3490 String Successor Time Limit: 2 Seconds      Memory Limit: 65536 KB The succes ...

  4. String Successor zoj 3490

    链接 [https://vjudge.net/contest/294259#problem/D] 题意 就是给你一个字符串,要进行n次操作 让你输出每次的字符串 操作规则: 1.如果有数字或者字母就忽 ...

  5. String Successor(模拟)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3490 题意:给出一个字符串,一个操作次数,每次操作从当前字符串最右边的字符 ...

  6. zoj 3490

    蛋都疼了,高了半天,Output Limit Exceeded 原来是输入的问题,我靠!!以后还是用输入输出c++好,这尼玛!!郁闷!!!!! #include<stdio.h> #inc ...

  7. ZOJ 3985 - String of CCPC - [字符串处理]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3985 题意: 给出一个长度为n的字符串,全部由'C'和'P'组成 ...

  8. ZOJ - 3985 - String of CCPC (思维 + 暴力)

    题意: 询问一共有有多少个CCPC,每个得1分,可以自己在任意位置添加字母,第i次添加需要耗费i-1分 思路: 既然每次添加需要耗分,添加第二个字母,相当于没有添加,所以只需要添加一次就好 先计算出原 ...

  9. 一位学长的ACM总结(感触颇深)

    发信人: fennec (fennec), 信区: Algorithm 标 题: acm 总结 by fennec 发信站: 吉林大学牡丹园站 (Wed Dec 8 16:27:55 2004) AC ...

随机推荐

  1. ajax发送请求

    首先创建XMLHttpRequest对象,利用此对象发送请求 主页面 <!doctype html> <html lang="en"> <head&g ...

  2. spark向量、矩阵类型

    先来个普通的数组: scala> var arr=Array(1.0,2,3,4) arr: Array[Double] = Array(1.0, 2.0, 3.0, 4.0) 可以将它转换成一 ...

  3. .NET 进程和线程

    一.进程:需要有用Process类用法一:Process.Start("calc");该方法弊端:有许多程序不知道它的运行名字到底是什么,如果写错了,就会出现程序崩溃错误用法二:/ ...

  4. C语言经典案例

    题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%:20万到40万 ...

  5. 九度OJ 1514 数值的整数次方【算法】

    题目地址:http://ac.jobdu.com/problem.php?pid=1514 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的expo ...

  6. struts2自定义拦截器与cookie整合实现用户免重复登入

    目的:测试开发时,为了减少用户登入这个繁琐的登入验证,就用struts2做了个简单的struts2拦截器,涉及到了与cookie整合,具体的看代码 结构(两部份)=struts2.xml+自定义拦截器 ...

  7. VS2005调试时无法找到调试信息解决方法

    调试C++程序的时候出现,无法找到.exe的调试信息,或者调试信息不匹配.未使用调试信息生成二进制文件.解决方法:打开菜单项目->项目属性页: 1.选择配置属性->链接器->调试-& ...

  8. mysql---左连接、右连接、内连接之间的区别与联系

    现有两张表 第一张表为男生表,记录了男生的姓名和配偶的编号 第二张表为女生表,记录了女生的姓名和自己的编号 第一种情况:主持人请所有男生都上台,并且带上自己的配偶.这时不管男生有没有配偶都要上台,所以 ...

  9. C++对象创建与释放

    创建对象有以下四种形式: #include <iostream> using namespace std; class A{ private: int i; public: A(){ co ...

  10. javascript 弹出的窗口返回值给 父窗口

    直接上代码,有些地方可以用到: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <H ...