第6章練習題--4--迴圈數--2952
阿新 • • 發佈:2019-01-26
#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中是否存在子串=a for( 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); else printf("%s is not cyclic\n",s); } return 1; }
首先,如果不用大數相乘的辦法,可以將乘法轉化成加法來計算。
其次,如果結果陣列的長度與原陣列長度不同,那必然不是迴圈數。
第三,判斷相同長度的陣列是否是迴圈數,我採用了比較浪費空間的辦法,就是將其中一個數組複製,判斷另一個string是否是其子串。
這道題雖然AC了,但是還有不少漏洞,比如說s和a陣列重複,而且採用字元來計算也很容易出錯。