在openjudge上做题时把代码写出来了,并且没有报错,然后也符合样例输入和输出,但在提交的时候会反馈出答案错误,不知道问题出在了哪里,有好心人可以帮我看看代码并为我解答吗?
题目描述
若一个n位的数字串满足下述条件,则称其是循环数(cyclic):将这个数字串视为整数(可能带有前导0),并用任意一个 1 到 n 之间(包含1和n)的整数去乘它时, 会得到一个将原数字串首尾相接后,再在某处断开而得到的新数字串所对应的整数。例如,数字 142857 是循环数,因为:
142857 *1 = 142857
142857 *2 = 285714
142857 *3 = 428571
142857 *4 = 571428
142857 *5 = 714285
142857 *6 = 857142。
请写一个程序判断给定的数是否是循环数。
注意:在此题中,输入数字串允许带前导0,且前导0不能被忽略,例如“01”是两位数字串,而“1”是一位数字串。但将数字串转化为整数做乘法运算或比较运算时,可以忽略前导0。
输入
一行,一个长度在 2 到 60 位之间的数字串。
输出
一个整数,若输入的数字串是循环数,输出1,否则输出0。
下面是我写的代码:
#include <complex.h>
#include <errno.h>
#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void link(char str1[], char str2[] ); //链接两个字符串
void move(int num[] , char str[]); //将字符数组的值储存为整型数组
void multiple(int num1[] , const int num2[] , int n);
int mystrstr(char * str , char * substr); //在一个字符串中查找子串的函数
int intlen(const int num[]); //统计整型数组的元素个数,实现与strlen函数相同的效果
int main(void){
int num2[100000];
char str1[100000] , str2[100000] , str3[1000000];
int sum = 0 , len =0;
scanf("%s" , str1);
len = strlen(str1);
move(num2, str1);
link(str1, str2);
for (int i = 1; i <= len; i++) {
int new_num[100000];
multiple(new_num, num2, i);
for (int j = 0; j < strlen(str3); j ++)
str3[i] = '\0'; //每次循环都清空这个字符串
for (int q = 0; q < intlen(new_num); q ++)
str3[q] = new_num[q] + '0';
str3[intlen(new_num)] = '\0'; //将str3转换为字符串
if (mystrstr(str2, str3) != -1)
sum ++;
for (int q = 0; q < intlen(new_num); q ++)
new_num[q] = 0; //清空new_num中的内容
}
//printf("%d\n%d\n" , sum , len);
if (sum == len)
printf("%d" , 1);
else
printf("%d" , 0);
return 0;
}
void link(char str1[] , char str2[]){
int i = 0 , j = 0 ;
while (str1[i] != '\0') {
str2[i] = str1[i];
i++ ;
}
while (str1[j] != '\0') {
str2[i + j] = str1[j];
j++;
}
str2[i + j] = '\0';
}
void move(int num[] , char str[]){
int len = strlen(str);
for (int i = 0; i < len; i++)
num[i] = str[i] - '0' ;
}
void multiple(int num1[] , const int num2[] , int n){
int len = 0 , t = 0;
len = intlen(num2);
for (int i = 0 ; i < len; i ++)
num1[i] = num2[i];
for (int i = len - 1; i >= 0 ; i --) {
num1[i] = num1[i] * n + t ;
t = num1[i] / 10;
num1[i] = num1[i] % 10;
}
}
int mystrstr(char * str,char * substr){
int num = 0;
while (*str != '\0'){
if (*str != *substr){
str++;
num++;
continue; //匹配失败就跳过接下来的步骤继续查找下一个
}
//若匹配成功,则创建临时指针
char * tmpstr = str;
char * tmpsubstr = substr;
while (*tmpsubstr != '\0'){
if ( *tmpstr != *tmpsubstr ){
//匹配失败
str++;
num++;
break;
}
tmpstr++;
tmpsubstr++;
}
if (*tmpsubstr == '\0') //匹配成功
return num;
}
return -1; //失败就返回-1
}
int intlen(const int num[]){
int len = 0;
//统计整型数组的长度
while (num[len] != '\0')
len ++;
return len;
}