题目描述:小红拿到了一个数字串,她每次操作可以使得其向左循环移动一位。将串 s=s0 s1...sn−1s 向左循环移动一位,将得到串s1...sn−1s0。小红想知道,使得该数字串变成4的倍数,需要最少操作多少次?(可以包含前导零)
输入描述:一个数字串,长度不超过10510^5105
输出描述:如果无法达成目的,则输出-1。否则输出一个整数,代表最少的操作次数。
#include<iostream>
#include<string.h>
using namespace std;
const int N=1e5+5;
int main(){
char s[N];
int a[N],n;
char c = getchar();
while(c < '0' || c > '9')
c = getchar();
while(c >= '0' && c <= '9')
a[++n] = (c - '0'),c = getchar();
if(n == 1)
{
if(a[1] % 4)
{
cout << -1;
return 0;
}else{
cout << 0;
return 0;
}
}
if((a[n - 1] * 10 + a[n]) % 4 == 0)
{
cout << 0;
return 0;
}
if((a[n] * 10 + a[1]) % 4 == 0)
{
cout << 1;
return 0;
}
for(int i = 1;i < n;i++)
if((a[i] * 10 + a[i + 1]) % 4 == 0)
{
cout << i + 1;
return 0;
}
cout << -1;
return 0;
}
-
首先定义了一些常量和变量:
const int N = 1e5 + 5;
:用于存放输入字符串的最大长度。char s[N];
:定义一个字符数组来存放输入的字符串,但由于代码并未使用此数组,所以在此处可忽略。int a[N];
:定义一个整数数组用来存放读取到的每个字符转换成的整数值。int n;
:记录当前读取到的有效数字字符的数量。
-
使用
getchar()
逐个读取字符直到遇到第一个数字字符,并将其转换为整数值存入数组a[]
中,同时更新计数器n
。 -
如果只读取到一个数字字符(
n == 1
),直接判断这个数字是否能被4整除,如果能,则输出0,否则输出-1。 -
接下来检查最后两位数字是否能被4整除,如果能,则输出0。
-
然后检查首位数字与末尾数字组合起来是否能被4整除,如果能,则输出1。
-
使用一个for循环遍历数组
a[]
,检查每一对相邻的数字(a[i]
和a[i+1]
)是否能被4整除。如果找到满足条件的一对,则输出它们的位置i + 1
,并结束程序。 -
如果经过以上所有步骤都没有找到符合条件的数对,则输出-1。