#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
void f(char a[], int n, int k, int l);
int main(){
int n;
int k;
scanf("%d %d",&n,&k);
char number[100000];
scanf("%s",number);
int l= 0;
if( n%2 == 0) f(number,n,k,l);
else {l = 1;f(number,n,k,l);}
return 0;
}
void f(char a[], int n, int k, int l) {
int c = 0;
for( int i = 0; i <= n/2; i++) {
if( a[n/2 - 1 - i] > a[n/2 + l + i]) {a[n/2 + l + i] = a[n/2 - 1 - i];c++;}
if( a[n/2 - 1 - i] < a[n/2 + l + i]) {a[n/2 - 1 - i] = a[n/2 + l + i]; c++;}
if( c > k) {printf("-1"); break;}
}
if( c <= k) {
int i = 0;
while( c != k || c != (k-1)) {
if( a[i] != 57) { a[i] = 57; a[n-1-i] = 57; c+=2;}
i++;
}
if(c == k-1 && n%2 == 1) a[n/2] = 57;
printf("%s", a);
}
return;
}
我试图通过改变k个字符来制作一个长度为n的回文串,并使数字尽可能大。 对于前 输入:4 1 3943 输出:3993 输入:6 3 092282 输出:992299 请引导我分析故障及其原因。 非常感谢:D
答案 0 :(得分:1)
中使用的条件
while( c != k || c != (k-1)) {
错了。它永远都是真的。由于该错误,i
不断增加,您最终访问a
越界。
您需要使用&&
代替||
。
while( c != k && c != (k-1)) {
^^^^