题意:

给定一个固定长度的字符串, 字符串是一个含有前导0的数字, 问这个数字加上多少能构成一个回文字符串。

分析:

其实这题有很多种方法, 方法12是我做完后看别人代码总结的, 方法3是我当时想的一种方法。

方法一:

最直观的想法,从这个数字开始枚举, 知道找到回文字符串为止。

注意 %0'length‘d 可以输出前导0 , 比如 %03d输出1的话就是 ”001“

另外代码需要注意效率, 不然容易超时。

 #include<bits/stdc++.h>
using namespace std;
int len;
bool pre(const char a[]){//判断是否回文串
for(int i = , j = len - ; i < j; i++, j--){
if(a[i] != a[j])
return false;
}
return true;
}
int main(){
char str[];
while(scanf("%s", str )){
len = strlen(str); if (len == ) break; int i = , n = atoi(str);//先将str转化为int char print[], buf[]; sprintf(print, "%%0%dd", len);//构造出“%0'长度'd”的字符串, 方便下面sprintf输出前导0 memcpy(buf,str,len);//可以将枚举数组设为buf, 就不用更改原来数组了 while(!pre(buf)){//枚举即可
i++;
sprintf(buf,print, n + i);
}
printf("%d\n", i); }
}

方法二:

构造出最接近的回文串, 方法是从判断每一对回文, 如果高位大于低位, 低位更改为高位, 否则低位的前一位进一, 低位更改为高位。

 #include<bits/stdc++.h>
using namespace std;
int len;
int a[];
char s[];
void carry(){
for(int i = len - ; i >= ; i --){
if(a[i] >= ){
a[i-] ++;
a[i] %= ;
}
}
}
bool change(){
for(int i = , j = len - ; i < j; i++, j--){
if(a[i] > a[j]){
a[j] = a[i];//位置对应的高低位, 如果高位大于低位的, 后面直接更改为低位
}else if(a[j] > a[i]){
a[j] = a[i];//否则 如果低位大于高位的, 低位的前一位++, 低位改为高位
a[j-] ++;
carry();
return true;//进位后要重新进行一次change(), 因为进位的可能是之前已经判断过的字符
}
}
return false;
}
int main(){
while(scanf("%s", s)){
len = strlen(s);
if(len == ) break;
int n1, n2;
sscanf(s,"%d", &n1);
for(int i = ; i < len; i++){
a[i] = s[i] - '';
}
a[len] = ;
while(change());
n2 = ;
for(int i = len - ; i >=;i--){
n2 *= ;
n2 += a[i];
}
printf("%d\n", n2 - n1);
}
return ;
}

方法三:

我自己的想法是判断最内层的非回文对, 如果高位大于低位, 那么低位以及低位之后的都更改为高位的回文,

否则的话, 偶数情况中间两个字符中较小的(同样大小取高位),奇数情况则直接取中间的数, 这个数字+1, 如果有进位先进位。

然后这个数字之后的所有数字都更改为与之对应的高位, 那么就是回文串。

 #include <bits/stdc++.h>
using namespace std;
int n;
int len;
int main(){
char s[];
while(scanf("%s", s)){
int len = strlen(s);
int n1, n2;
sscanf(s,"%d",&n1); if (len == ){
break;
}
int k = -, i; for(i = ; i < len/; i++){
if(s[i] != s[len - i - ]){
k = i;
}
}
if(k == -){
printf("0\n");
continue;
}
// printf("k : %d\n", k);
if( s[len - k - ] < s[k]){//如果最里面不同一对的低位 小于高位 改这一对的后面
s[len-k-] = s[k];
int cnt = ;
for(int i = len-k; i < len; i++){
s[i] = s[len - i - ];
}
}
else // 只能改中间
{
int mid;
if(len % == ){//偶数情况哪个小要哪个
mid = s[len/-] <= s[len/] ? len/-: len/;
}
else{
mid = len/;
} s[mid]++;
for(int i = mid; i >= ; i--){
if(s[i] > ''){
s[i] = '';
s[i-]++;
}
}
for(int i = mid+; i < len; i++){
s[i] = s[len-i-];
} }
sscanf(s,"%d",&n2);
printf("%d\n", n2 - n1); }
return ;
}

UVaLive 4868 Palindrometer (暴力 / 构造)的更多相关文章

  1. UVALive 4868 Palindrometer 暴力

    F - Palindrometer Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit ...

  2. 暴力+构造 Codeforces Round #283 (Div. 2) C. Removing Columns

    题目传送门 /* 题意:删除若干行,使得n行字符串成递增排序 暴力+构造:从前往后枚举列,当之前的顺序已经正确时,之后就不用考虑了,这样删列最小 */ /*********************** ...

  3. Codeforces Round #306 (Div. 2)A B C D 暴力 位/暴力 暴力 构造

    A. Two Substrings time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  4. UVALive 7269 Snake Carpet (构造)

    题目:传送门. 题意:构造出一个矩阵,使得矩阵含有n条蛇,每条蛇的长度是1到n,并且奇数长度的蛇有奇数个拐弯,偶数长度 的蛇有偶数个拐弯. 奇数和偶数分开构造,奇数可以是: 1357 3357 555 ...

  5. UVALive 6088 Approximate Sorting 构造题

    题目链接:点击打开链接 题意: 给定一个n*n的01矩阵 我们跑一下例子== 4 0111 0000 0100 0110 0123 \|____ 0|0111 1|0000 2|0100 3|0110 ...

  6. Karen and Game CodeForces - 816C (暴力+构造)

    On the way to school, Karen became fixated on the puzzle game on her phone! The game is played as fo ...

  7. UVALive 5107 dfs暴力搜索

    题目链接:A hard Aoshu Problem DES:给三个字符串,包含的字符是A-E范围内的.长度都不超过8.每个字符可以而且只可以匹配一个数字.两个字符不能匹配相同的数字.前两个式子之间可以 ...

  8. UVALive 5844 dfs暴力搜索

    题目链接:UVAive 5844 Leet DES:大意是给出两个字符串.第一个字符串里的字符可以由1-k个字符代替.问这两个字符串是不是相等.因为1<=k<=3.而且第一个字符串长度小于 ...

  9. Codeforces Round #487 (Div. 2) A Mist of Florescence (暴力构造)

    C. A Mist of Florescence time limit per test 1 second memory limit per test 256 megabytes input stan ...

随机推荐

  1. 《windows核心编程系列》三谈谈内核对象及句柄的本质

    内核对象 本章讨论的是相对抽象的概念,不涉及任何具体的内核对象的细节而是讨论所有内核对象的共有特性. 首先让我们来了解一下什么是内核对象.内核对象通过API来创建,每个内核对象是一个数据结构,它对应一 ...

  2. C++入门知识点总结

    阅读目录 1 C++中的命名空间 C++中使用命名空间来解决在相同文件或范围的同名变量问题,示例程序如下: #include <iostream> using namespace std; ...

  3. SIFT特征点检测与匹配

    SIFT的步骤如下: (1) 尺度空间极值检测(Scale-space Extrema Detection) 也就是在多尺度高斯差分(Difference of Gauss)空间中检测极值点(3x3x ...

  4. Permutation UVA - 11525(值域树状数组,树状数组区间第k大(离线),log方,log)(值域线段树第k大)

    Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序 ...

  5. 题解报告:hdu 1570 A C

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1570 Problem Description Are you excited when you see ...

  6. Service官方教程(5)后台服务发送通知、把服务变前台服务。

    1.Sending Notifications to the User (发送通知) Once running, a service can notify the user of events usi ...

  7. 174 Dungeon Game 地下城游戏

    一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格布局.我们英勇的骑士(K)最初被安置在左上角的房间里,并且必须通过地下城对抗来拯救公主.骑士具有以正整数 ...

  8. c语言-依赖倒转

    当一个文件(aa.c文件)依赖于头文件(bb.h)时,如果bb.c编译之后形成的bb.o文件重新编译后,aa.o的文件不需要重新编译 aa.c文件: bb.h文件:对bb.c文件进行声明 bb.c文件 ...

  9. Tinking in Java ---Java的NIO和对象序列化

    前面一篇博客的IO被称为经典IO,因为他们大多数都是从Java1.0开始就有了的:然后今天这篇博客是关于NIO的,所以的NIO其实就是JDK从1.4开始,Java提供的一系列改进的输入/输出处理的新功 ...

  10. 网页制作常用的CSS知识

    在制作网页中,我们会用到很多CSS的知识,在这里我简单的总结了一些. div    划分区块 ul,li 无序列表(配合划分区块) ol,li 有序列表 a 超链接标签 p 段落标签 h 标题标签 i ...