(问题求解)openjudge:1.13:06:循环数问题

在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;
}

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值