有 \(T\) 组数据。
对于每组数据:
给定一个整数,求出你至少需要删除该整数的几个数字来使这个整数变成 \(25\) 的倍数?
题目分析结论:任一个 \(25\) 的正整数倍数的结尾为 00
或 25
或 50
或 75
。
证明:
令 \(y=25x\)(\(x\) 为正整数)。
当 \(x=1\) 时,\(y\) 为 \(25\)。
当 \(x=2\) 时,\(y\) 为 \(50\)。
\(\cdots\)
当 \(x=m\) 时,\(y\) 为:
\(25m\)
\(=25(m-1)+25\)
\(=25(m-2)+25\times2\)
\(\cdots\)
\(=25+(m-1)\times25\)
于是易得结论。
我们把 \(00\)、\(25\)、\(50\)、\(75\) 这四个数存入一个二维字符串,并称为倍数串。
在输入数时,可以也用字符串读入,这样方便比较。
如果比对得上,那么立即匹配下一个倍数串,在所有值中取最小值。
剩下的看一下代码。
代码//2021/10/13
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#define int long long
#define enter() putchar(10)
#define debug(c,que) cerr<<#c<<" = "<<c<<que
#define cek(c) puts(c)
#define blow(arr,st,ed,w) for(register int i=(st);i<=(ed);i++)cout<<arr[i]<<w;
namespace Newstd
{
inline int read()
{
char c;
bool flag=false;
while((c=getchar())<'0' || c>'9')
{
if(c=='-') flag=true;
}
int res=c-'0';
while((c=getchar())>='0' && c<='9')
{
res=(res<<3)+(res<<1)+c-'0';
}
return flag?-res:res;
}
inline void print(int x)
{
if(x<0)
{
putchar('-');x=-x;
}
if(x>9)
{
print(x/10);
}
putchar(x%10+'0');
}
}
using namespace Newstd;
using namespace std;
string tmp[5];
inline void solve(string str)
{
int ans=str.size(),len=str.size();
for(register int i=0;i<=3;i++)
{
int idx=1;
for(register int j=len-1;j>=0;j--)
{
if(tmp[i][idx]==str[j])
{
idx--;
}
if(idx==-1)
{
ans=min(ans,len-j-2);
break;
}
}
}
cout<<ans<<'\n';
}
#undef int
int main(void)
{
#define int long long
std::ios::sync_with_stdio(false);
tmp[0]="00";
tmp[1]="25";
tmp[2]="50";
tmp[3]="75";
int T;
cin>>T;
while(T--)
{
string str;
cin>>str;
solve(str);
}
return 0;
}