L1-006. 连续因子
题目地址:https://www.patest.cn/contests/gplt/L1-006
思路:
(0)若没有因子,则为素数,应输出N本身和连续长度1
(1)找到第一个因子i,也即起始点;
(2)被除数n=n/i,i++。连续长度le=1;
(3)如果n还能被i整除,le++,重复(2);不能:保存长度,保存起始点,重新寻找起始点,重复(1)(2)(3),找到,比较长度,更长的则替换原来的长度和起始点,直到寻找到根号N+1。
注意点:需要两个值来储存最大的长度和相应的起始点,在检测连续因子下一个值不满足时,需不需要跳回到起始因子的下一个?????????????
答案是需要的,不然会出现有一个测试点错误。这个测试点的值有什么特点????????
1 #include<stdio.h> 2 #include<math.h> 3 int main() 4 { 5 int n,i; 6 scanf("%d",&n); 7 int max_length,max_start; 8 max_length=0,max_start=0; 9 for(i=2;i<=sqrt(n)+1;i++) 10 { 11 if(n%i==0) //找到第一个被能被整除的数 12 { 13 int j,nn,start,length; 14 nn=n; 15 start=i; 16 j=i; 17 length=0; 18 while(nn%j==0) 19 { 20 nn/=j; //新的被除数 21 j++; //新的除数 22 length++; //长度加一 23 } 24 if(length>max_length) //找到更长的连续因子 25 { 26 max_length=length; 27 max_start=start; 28 } 29 } 30 } 31 if(max_length==0) //素数; 32 { 33 max_start=n; 34 max_length=1; 35 } 36 printf("%d\n",max_length); 37 printf("%d",max_start); 38 for(i=max_start+1;i<max_start+max_length;i++) 39 printf("*%d",i); 40 printf("\n"); 41 return 0; 42 }