1096.Consecutive Factors (20)

来源:互联网 发布:大连贵金属行情软件 编辑:程序博客网 时间:2024/06/08 12:28

1096.Consecutive Factors (20)

pat-al-1096

2017-01-28

  • 完全参考了1096. Consecutive Factors (20)-PAT甲级真题
  • 题意:对一个给定的n,找出其最长的连续因子;如果长度相等时,输出起始值较小的那个序列
  • 思想:因为给定数范围的限制(int的范围),最多能允许12位数连乘,那么要求最长连续因子,就从len = 12开始暴力搜索,每一次搜索以初始因子为2开始连乘(因为要求不包括1),直到连乘的个数等于当前的len,就把连乘的结果和给定的n相比较,如果相等就输出答案;如果不等,就把初始因子加一再继续,直到初始因子大于sqrt(n)就跳出,本次搜索失败进行下一次len的搜索。
  • 关于为什么初始因子最大也不能超过sqrt(n):这和求素数的一种限制是一样的——最大不超过sqrt(n),如果从超过sqrt(n)的数开始,向后进行连乘就超过n了呀,自己可以在草稿纸上算一算。
  • 一个测试点:n = 8064时,应该输出2*3*4,而不是6*7*8
  • 坑见注释
  • 这题我自己以前也写(抄)过,但写的好复杂,也看了一点别人写的,目前觉得上面给出链接这位同学的答案最简洁(一道只要理解了就很好做的题)
/** * pat-al-1096 * 2017-01-27 * C version * Author: fengLian_s */#include<stdio.h>#include<math.h>int main(){  //本题没什么思路(甚至一开始题目都没读懂QAQ),完全参考了别人的,链接见md文件  //test:  // long result1 = 1;  // for(int i = 0;i < 31;i++)  //   result1 *= 2;  // long result2 = 1;  // for(int i = 1;i <= 12;i++)  //   result2 *= i;  // long result3 = 1;  // for(int i = 1;i <= 13;i++)  //   result3 *= i;  // printf("result1 = %ld\n", result1);  // printf("result2 = %ld\n", result2);  // printf("result3 = %ld\n", result3);  //test end  freopen("in.txt", "r", stdin);  int n;  scanf("%d", &n);  int max = sqrt(n);  for(int len = 12;len >= 1;len--)//坑:len必须是>=1,等于号必须加上,不然连乘因子数等于1的情况无法输出  {    for(int start = 2;start <= max;start++)    {      int ans = 1;      for(int i = start;i - start <= len - 1;i++)        ans *= i;      if(n % ans == 0)      {        printf("%d\n%d", len, start);        for(int i = start+1;i - start <= len - 1;i++)          printf("*%d", i);        putchar('\n');        return 0;      }    }  }  printf("1\n%d\n", n);//坑,不加这句,素数会没有输出}

-FIN-

0 0