7-6 连续因子

简介: 7-6 连续因子

7-6 连续因子

题目

7-6 连续因子 (20 分)

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数 N(1<N<2^31)。

输出格式:

首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:

630

输出样例:

3

567

我的算法

// 我的算法又长又难以理解

#include<stdio.h>
#include<math.h>
int main(void)
{
  int n, i, j, k = 0, t = 0, flag = 0;
  int index = 0;
  int max = 0, cnt = 1;
  int cnt2 = 0;
  int a[200];
  int b[100][100];
  int c[10000] = {0};
  scanf ("%d", &n);
  int m = sqrt (n), temp = n;
  for (i = 2; i <= m; i++)
  {
    if (temp % i == 0)
    {
      break;
    }
  }
  if (i > m)
  {
    flag = 1;
  }
  if (flag)
  {
    max = 1;
    a[0] = n;
    cnt = 1;
    printf ("%d\n%d\n", max, n);
  }
  else
  {
    for (i = 2; i <= m + 1; i++)
    {
      t = 0;
      if (temp % i == 0)
      {
        b[k][t] = i;
        t++;
        temp /= i;
        cnt = 1;
        for (j = i + 1; j <= m + 1; j++)
        {
          if (temp % j == 0 && temp != 0)
          {
            b[k][t] = j;
            t++;
            temp /= j;
            cnt++;
          }
          else
          {
            c[k] = cnt;
            k++;
            temp = n;
            break;
          }
        }
      }
    } 
    for (i = 0; c[i] != 0; i++)
    {
      if (i == 0)
      {
        max = c[0]; 
      }
      if (max < c[i])
      {
        max = c[i];
        index = i;
      }
    }
    printf ("%d\n", max);
    for (i = 0; i < max; i++)
    {
      printf ("%d", b[index][i]);
      if (i < max - 1)
      {
        putchar ('*');
      }
    }
  }
  return 0;
}

好的算法

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    long long n,m,i,j,k,sum = 0,num;  //int会爆掉
    cin >> n;
  m = sqrt(n);
    for(i = 2;i <= m; i++) // 需要计算的范围就是i到n的根号 
    {
        k = n;          // 备份原来的数 
        for(j = i; k % j == 0; j++) // 计算连续了几次 
        {
            k /= j;
        }
        if(j - i > sum)
        {
            sum = j - i;      // 连续的次数 
            num = i;        // 从多少开始连续的 
        }
    }
    if(sum == 0)
    {
        sum = 1;        // 输入的数字是质数的时候的情况 
        num = n;
    }
    cout<< sum << endl;
    for(int i = num; i < num + sum; i++)
    {
        if (i != num) putchar('*');
    cout << i;  
    return 0;
}

运行结果:

相关文章
|
6月前
|
C++
【PTA】​L1-006 连续因子​(C++)
【PTA】​L1-006 连续因子​(C++)
208 0
【PTA】​L1-006 连续因子​(C++)
|
5月前
技术心得记录:可决系数R^2和方差膨胀因子VIF
技术心得记录:可决系数R^2和方差膨胀因子VIF
65 0
|
6月前
|
算法 BI 测试技术
【唯一分解定理 数学】1808好因子的最大数目
【唯一分解定理 数学】1808好因子的最大数目
【唯一分解定理 数学】1808好因子的最大数目
|
6月前
|
算法 测试技术 C#
【滑动窗口】【差分数组】C++算法:K 连续位的最小翻转次数
【滑动窗口】【差分数组】C++算法:K 连续位的最小翻转次数
|
6月前
|
算法 Java C++
动态求连续区间和
动态求连续区间和
42 0
|
11月前
|
算法 测试技术 C#
C++前缀和算法的应用:最大化城市的最小供电站数目(二)
C++前缀和算法的应用:最大化城市的最小供电站数目
|
11月前
|
算法 数据挖掘
一些连续离散化方法
一些连续离散化方法
151 0
L1-006 连续因子 (20 分)
L1-006 连续因子 (20 分)
139 0
7-8 连续因子 (20 分)
7-8 连续因子 (20 分)
111 0