题目描述
输入
输出
样例数据
输入(1)
3
123456
输出(1)
124124
输入(2)
3
12345
输出(2)
100100
代码
题不难,就是需要分类讨论一下
#include<stdio.h>
#include<string.h>
//这道题是T8循环节
int main()
{
int A;
char x;//存储A和L之间的回车
char L[100005] = {};
// 为啥要用字符串呢,很简单,因为这个题的数据很明显放在long long int里面也存不下啊
// 所以只能按字符串来存储和比较了
char L1[100005] = {},L2[100005] = {},L3[100005] = {};
int n = 0;
scanf("%d%c%s",&A,&x,L);
long int len;
len = strlen(L);
if(len % A != 0)//首先考虑的是,已知数列的位数不是给定循环节长度的整数倍。
// 我来举个例子,比如说数据是12345, 3
// 那很明显循环节最少也得是6位,而任何一个六位数肯定都要比五位数大
// 所以我们只需要取最小的6位数就可以了
{
L1[0] = 1;
for(int i = 1;i < A;i ++)
{
L1[i]=0;
}
n = len / A;
for(int i = 1; i <= n + 1; i ++)
{
for(int j = 0; j < A; j ++)
{
printf("%d",L1[j]);
}
}
}
else
{
int p = 0;
for(long int i = 0; i < len; i ++)
{
L2[i] = '9';
}
// 第二种情况就是 比如说给的数是9999 2
// 那很明显。最小的数还是10000
// 基本和不能整除是一样的
p = strcmp(L,L2);
if(p == 0)//如果已知的数列是9999这个类型的话,处理方式应该参考上面不能整除的情况
{
L1[0] = 1;
for(int i = 1;i < A;i ++)
{
L1[i] = 0;
}
n = len / A;
for(int i = 1; i <= n+1; i ++)
{
for(int j = 0; j < A; j ++)
{
printf("%d",L1[j]);
}
}
}
else//当已知的数列不是9999这个类型的时候,需要进一步分析
{
int q = 0;
// 比如说数据是123456789, 3
for(int i = 0; i < A; i ++)
{
L3[i] = L[i];
}
// 现在L3是123000000了
for(long int i = 0; i < len - A; i ++)
{
L3[i + A] = L3[i];
}
// 现在L3是123123000了
// 简单来说,就是比较一下这个字串是一个越往后数字越大的字串还是越往后数字越小的字串
// 如果越往后越小,那直接把开头复制到后面好几遍就可以了
// 比如说123111111,3
// 那结果就是123123123
// 如果越往后面越大,比如上面这样
// 那就得把第一个小循环+1,再往后面复制
// 也就是124124124
q = strcmp(L,L3);
if(q < 0)
{
for(long int i = 0;i < len;i ++)
{
printf("%d",L3[i] - 48);
}
}
else
{
L3[A-1] ++;
for(long int i = 0; i < len - A; i ++)
{
L3[i + A] = L3[i];
}
for(long int i = 0; i < len; i ++)
{
printf("%d",L3[i] - 48);
}
}
}
}
printf("\n");
return 0;
}