第6章练习题--4--循环数--2952

来源:互联网 发布:mac西柚色和珊瑚色区别 编辑:程序博客网 时间:2024/06/08 16:46
#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>//using namespace std;int main(){char s[65], a[65], b[125];int len, i, k;bool flag ;memset( a , 0 , sizeof(char)*65 );memset( b , 0 , sizeof(char)*125 );while( scanf("%s" , s) != EOF ){len = strlen(s);for( i = 0 ; i < 65 ; i ++ ) a[i] = 0 ;for( i = 0 ; i < 125 ; i ++ ) b[i] = 0 ;for( i = 0 ; i < len ; i++ )a[i] = s[len-i-1];strcpy( b , a );k = 1;flag = true;while(k < len ){for( i = 0 ; i < len ; i++ ){b[i] = ( b[i] - '0' ) + ( a[i] - '0' ) + '0';if( ( b[i] - '0') > 9 ){b[i+1]++;b[i] = b[i] - 10 ;}}for( i = len ; (b[i]-'0') > 0 ; i++ ){if( (b[i]-'0') > 9 ){b[i+1]++;b[i] = b[i] - 10 ;}}b[i] = '\0';if( i > len ) flag = false;else{//扩展后的b中是否存在子串=afor( i = len ; i < 2*len ; i++ )b[i] = b[i-len];b[i] = '\0';if( !strstr(b,a) ) flag = false;for( i = len ; i < 2*len ; i++ )b[i] = '0';}k ++ ;}if(flag)printf("%s is cyclic\n",s);elseprintf("%s is not cyclic\n",s);}        return 1;    }

首先,如果不用大数相乘的办法,可以将乘法转化成加法来计算。

其次,如果结果数组的长度与原数组长度不同,那必然不是循环数。

第三,判断相同长度的数组是否是循环数,我采用了比较浪费空间的办法,就是将其中一个数组复制,判断另一个string是否是其子串。

这道题虽然AC了,但是还有不少漏洞,比如说s和a数组重复,而且采用字符来计算也很容易出错。

原创粉丝点击