算法 8.循环节

题目描述

在这里插入图片描述

输入

在这里插入图片描述

输出

在这里插入图片描述

样例数据

输入(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;  
} 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值