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;
}
运行结果: