1096.Consecutive Factors (20)

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-

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值