题目
解题的思路:
1.输入整数n
2^31 = 2,147,483,648, 而 12!< 2^31 < 13!
3~13相乘也大于2^31 所以最长有12个连续因子
2.求的答案是最长最小连续因子
3.从12~1个数进行遍历
4.从2~根号n进行遍历,根据个数,开头数字,计算是否合适,合适的话就输出答案并结束,否则继续
5.单独输出质数
代码
#include <stdio.h>
#include <stdlib.h>
int n_integer(int n,int number,int front);
void print_divisor(int number,int front);
int main()
{
int n,number,front; // 整数n,连续因子个数number,开头因子front
scanf("%d",&n);
/*
2^31 = 2,147,483,648, 而 12!< 2^31 < 13!
3~13相乘也大于2^31 所以最长有12个连续因子
*/
// 这里必须要是number>0,要把1包括在内,因为求得是最长最小连续因子。
// 例如:50,如果number>1,输出的是50,number>0输出的是2
for(number=12;number>0;number--) // 循环最长个数,从大到小
{
for(front=2;(long long)front*front<n;front++) // 循环因子,从小到大
{
if(n_integer(n,number,front)) // 判断整数n是否以front开头有number个连续因子
{
print_divisor(number,front); // 是的话就输出,并结束
}
}
}
print_divisor(1,n);//当数字n为质数的时候 ,输出原数
return 0;
}
int n_integer(int n,int number,int front)
{
while(number-- > 0)
{
if(n%front!=0)
{
return 0;
}
n = n/front;
front++;
}
return 1;
}
void print_divisor(number,front)
{
printf("%d\n%d",number,front);
number -- ;
front++;
while(number-- > 0)
{
printf("*%d",front);
front++;
}
exit(0); // 直接结束
}
结果
补充:
exit(0)代表正常结束程序,exit(1),exit(-1)代表非正常结束程序
C语言的整数 -2147483648 ~~ 2147483647(2^31)
n = n/t ++; 的含义是:n=n/t (t还未自增),之后t++;
例如:n=20; t=3; n = n/t ++;
答案:n=6,t=4
感谢B站up主:程序设计基础C99
https://www.bilibili.com/video/BV1K5411L7gS?from=search&seid=2015829533114709348&spm_id_from=333.337.0.0