题目描述
一个数通过最小次数交换数位变成20的倍数。问最少交换次数是多少?
输入
一个正整数T(1<=T<=200),代表有T组输入。每个输入包含一个正整数N(1<=N<=10的18次方),N没有前导0。
输出
最小的交换次数。如果不能交换出20的倍数,输出-1
样例输入 Copy
2
70007
680
样例输出 Copy
1
0
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
long long n,f,i,j,k,s,t;
int a[50],l;
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
l=log10(n)+1;
f=0;s=0;
if(n%20==0)
printf("0\n");
else
{
for(i=1;i<=l;i++)
{
a[i]=n%10;n=n/10;
if(a[i]==0)//记录0的个数
f++;
else if(a[i]%2==0)//记录偶数
s++;
}
if((f==1&&s==0)||l==1)//一个0且没有偶数不可能除20||位数为1
printf("-1\n");
else if(f==1&&s!=0)//一个0的时候且有偶数
{
if(a[1]==0)//个位为0
{
if(a[2]%2==0)//十位为偶数
printf("0\n");
else
printf("1\n");
}
else if(a[2]==0)//十位为0
{
if(a[1]%2==0)//个位为偶数
printf("1\n");//个位十位换
else
printf("2\n");
}
else
{
if(a[2]%2==0)//十位为偶数
printf("1\n");//只需要个位换0
else
printf("2\n");
}
}
else if(f>=2&&s==0)//0的个数大于1个且没有偶数位
{
if(a[1]==0&&a[2]==0)
printf("0\n");
else if(a[1]==0||a[2]==0)
printf("1\n");
else
printf("2\n");
}
else if(f>1&&s!=0)//0的个数大于1个且有偶数位 要考虑偶数位
{
if(a[1]==0)//个位0
{
if(a[2]%2==0)//十位为偶数
printf("0\n");
else
printf("1\n");
}
else
{
if(a[2]%2==0)
printf("1\n");
else
printf("2\n");
}
}
else
printf("-1\n");
}
}
}