解题思路:

注意事项:大数相乘时,为了避免后面位数太大,而超时,相乘的结果只取了后100位
参考代码:

#include#include #include #define MAX_MOD 101
#define MAX_N 6

//逆序字符串
void reverse(char* str)
{
    int left = 0;
    int right = (int)strlen(str) - 1;
    while (left < right)
    {
        char tmp = str[left];
        str[left] = str[right];
        str[right] = tmp;
        left++;
        right--;
    }
}
//将整数转换为字符串
void transform_str(char* str, int n)
{
    char* p = str;
    while (n)
    {
        *p = n % 10 + '0';
        n = n / 10;
        p++;
    }
    reverse(str);
}
//求大数后k位的余数
void get_mod(int k, char* str2,char* p)
{
    int len2 = (int)strlen(str2);
    if (k >= len2)
    {
        int i = k - len2;
        while (i--)
        {
            *p = '0';
            p++;
        }
        while (*str2)
        {
            *p = *str2;
            p++;
            str2++;
        }
    }
    else
    {
        int j = len2 - k;
        while (j--)
        {
            str2++;
        }
        while (*str2)
        {
            *p = *str2;
            p++;
            str2++;
        }
    }
}

//大数相乘—只取前100位
char* multiply(char* str1, char* str2)
{
    int len1 = (int)strlen(str1);
    int len2 = (int)strlen(str2);
    int t = 0;
    int n = len1 + len2 - 1;
    char* head = (char*)malloc((MAX_MOD) * sizeof(char));
    if (head == NULL)
    {
        return NULL;
    }
    memset(head, '0', (MAX_MOD) * sizeof(char));
    //位数相乘---只取前100位
    for (int i = len1 - 1; i >= 0; i--)
    {
        if (len1-1-i>=MAX_MOD-1)//只对str1的后100位进行计算
        {
            break;
        }
        n = MAX_MOD - 2 - (len1 - 1 - i);//位数相乘从哪位开始存储
        t = 0;//保存进位的数
        for (int j = len2 - 1; j >= 0; j--)
        {
            if (len2 - 1 - j+(len1-1-i) >= MAX_MOD-1)
            {
                break;
            }
            int k = (str1[i] - '0') * (str2[j] - '0') + t + (head[n] - '0');//位数相乘的值+进位的值+上一次的值
            head[n--] = k % 10 + '0';
            t = k / 10;
        }
        head[n] = t + '0';
    }
    head[MAX_MOD-1] = '\0';
    //高位去0
    char* q = head;
    char* p = head;
    while (*q == '0')
    {
        q++;
    }
    while (*q)
    {
        *p++ = *q++;
    }
    *p = '\0';
    return head;
}

int main()
{
    char str_n[200] = "0"; //服了,一直说答案错误,n改成字符串输入就对了
    int k = 0;
    int count = 0;
    scanf("%s%d", str_n, &k);
    char* str_l= "1";//循环长度用字符串来保存
    /*transform_str(str_n, n);*///之前将整数n转换字符串
    char mod[MAX_MOD] = "0";//n的k位数
    char* str_mult = NULL;
    char* str_mult_l = str_n;
    for (int i = 1; i <= k; i++)
    {
        get_mod(i, str_n, mod);
        count = 1;
        char mod_l[MAX_MOD] = "0";//当前str_mult下k位数
        char str_count[MAX_N] = "0";
        char* power = NULL;
        str_mult = str_n;
        //以k-1循环长度为基准,10次循环后还未找到,则k循环长度不存在
        while (count <=10)
        {
            str_mult = multiply(str_mult, str_mult_l);
            get_mod(i, str_mult, mod_l);
            if (strcmp(mod, mod_l) == 0)
            {
                break;
            }
            count++;
        }
        //跳出循环
        if (count == 11)
        {
            break;
        }
        transform_str(str_count, count);//不想再写一个乘法了,就用之前转换字符串吧
        str_l = multiply(str_l, str_count);//k的循环长度等于k-1循环长度*count
        //求n的k循环长度次幂大小,用于k+1的循环基准
        power = str_mult_l;
        while (count - 1)
        {
            str_mult_l = multiply(str_mult_l, power);
            count--;
        }
    }
    if (count == 11)
    {
        printf("-1");
    }
    else
    {
        printf("%s", str_l);
    }
    return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论