第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数组重复,而且采用字符来计算也很容易出错。

你可能感兴趣的:(String,扩展,include)