1. 程式人生 > >第6章練習題--4--迴圈數--2952

第6章練習題--4--迴圈數--2952

#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陣列重複,而且採用字元來計算也很容易出錯。