答:
思路:获取子串所表示的数字num,num%a是否等于b,如果满足条件则存入数组,全部判断完后进行输出。子串的获取方式:先遍历s[0]到s[n-1],获取第一个子串的数字ans,设子串的最后一个字符的索引为pos,则下一个子串的数字ans=ans*10+(s[pos]-'0')-(s[pos-len]-'0')*pow(10,len)。
代码的执行过程如下所示。
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
scanf("%d",&n);
while(n--)
{
string s;
cin>>s;
int len,a,b;
vector<string> str;
cin>>len>>a>>b;
int ans=0;
for(int i=0;i<len;i++)
{
ans=ans*10+(s[i]-'0');
}
int pos=len-1;
int sum=0;
while(true)
{
if(ans%a==b){
str.push_back(s.substr(pos-len+1,len));
sum+=1;
}
pos++;
if(pos>=s.size()){
break;
}
ans=ans*10+(s[pos]-'0')-(s[pos-len]-'0')*pow(10,len);
}
cout<<sum<<endl;
for(int i=0;i<sum;i++){
cout<<str[i]<<endl;
}
}
return 0;
}