一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式: 输入在一行中给出一个正整数 N(1<N<2 31 )。
输出格式: 首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
首先看到这个题目我想的是要最小连续因子序列,我想要设立一个标志,标志我要输出的数字从几开始,这时我要知道到几结束,于是我有设立的一个计数的变量来判断,于是编出的下列代码。
这里面我觉得难点就是判断flag的位置,于是我用来一个if-else语句来实现,当每次判断j是否为n的因子,如果是则count加1,否则count变为0,重头来过。
count1为是否更换flag的限制,保证不是count只要不为0就更换flag。
最后利用flag和count1就可以确定要输出数字的位置
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d",&n);
int i,flag=2,count=0,count1=0;//flag为开始输出数字的标志,count为计数的
int z,j;//z代替n,让n可以一直不变
int temp;
for(i=2;i<sqrt(n);i++)
{
z=n;
j=i;
while(z%j==0)
{
count++;
temp=z/j;
j++;
z=temp;
if(count>count1)
{
count1=count;
flag=i;
}
}
count=0;
}
if(count1>0)
{
printf("%d\n",count1);
for(i=0;i<count1;i++)
{
if(i==0)
printf("%d",flag+i);
else
printf("*%d",flag+i);
}
printf("\n");
}
else
{
printf("%d\n",1);
printf("%d",n);
}
return 0;
}