L1_6 连续因子
题目链接:https://www.patest.cn/contests/gplt/L1-006
参考链接:http://blog.csdn.net/qq_31359295/article/details/51598548(博主写的很好,谢谢提供)
在本题中主要为寻找连续最大长度,通过对所给定数值去根号来降低复杂度。
当N为质数时只需输出 1和它本身
当N为合数时,就一次判断能够被它整除的数,并记录连续最长长度。
#include<stdio.h> #include<math.h> //质数判断函数 (需牢记) int isPrime( int n ) { int i; for ( i = 2; i<sqrt((double)n) + 2; i++ ) //sqrt只对double和float进行运算 { if ( n % i == 0 ) return 0; } return 1; } int main() { int n; int max_long = 0; //最大长度 int max_size = 0; //初始值 int i, j; int sum; //输入数据 scanf( "%d", &n ); //判断是否为质数,若为质数,则输出1和n本身 结束程序 if ( isPrime( n ) ) { printf( "1\n" ); printf( "%d\n", n ); return 0; } for ( i = 2; i < sqrt((double) n ) + 2; i++ ) { //判断能否i整除n,减少循环 if ( n % i == 0 ) { sum = i; for ( j = i + 1; j < sqrt((double) n ) + 2; j++ ) { sum *= j; //若累乘sum不能整除n,则结束循环 if ( n % sum != 0 ) break; } //更新最大长度以及最小位置 if ( max_size < j - i ) { max_size = j - i; max_long = i; } } } //按照要求输出 printf( "%d\n", max_size ); for ( i = max_long; i <= max_long + max_size - 1; i++ ) { if ( i != max_long ) printf( "*" ); printf( "%d", i ); } printf( "\n" ); return 0; }