题意:
给定一个数,让你删除其中的若干个数位,使其成为完全平方数,当然也可以不删除,若无论如何删除也无法满足题意,输出-1,求满足题意需要删除的最少数位个数。
思路:
大体思路就是,暴力枚举,我是直接把给定的数转成字符串
scanf("%d", &n);
itoa(n, sn, 10);
以上两步代码,就是转整型为字符串的,itoa( )函数与atoi( )函数互逆。转换完时候,暴力枚举 n 以内的完全平方数,再将枚举到的完全平方数转化为字符串,同样用到itoa( )函数,再按位比较,用一个min维护即可。定两个位置p1, p2, 分别是整数 n 和 i ^ 2 的起始位置,<i> 然后p1一直执行++,扫到整数n的末位,<ii>如果碰到与i ^ 2第一个数位相等的,就执行p2++,扫i ^ 2接下来的数位。注意这两步的顺序。
本人AC代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
const int Inf = 1e9 + 7;
int n, ans;
char sn[12], si[12];
int main() {
scanf("%d", &n);
itoa(n, sn, 10);
ans = Inf;
int ln = strlen(sn);
for(int i = 1; i * i <= n; i++) {
itoa(i * i, si, 10);
int li = strlen(si);
int p1 = 0, p2 = 0; //p1对应n数位位置, p2对应 i^2 数位位置
while(p1 < ln) {
if(p1 < ln && p2 < li && sn[p1] == si[p2]) p2++;
p1++;
}
if(p2 == li) ans = min(ans, ln - li);
}
if(ans == Inf) puts("-1");
else printf("%d\n", ans);
}