原题链接:循环
解题思路:
注意事项:大数相乘时,为了避免后面位数太大,而超时,相乘的结果只取了后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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复