原题链接:循环
解题思路:
注意事项:大数相乘时,为了避免后面位数太大,而超时,相乘的结果只取了后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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复