一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<231)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按
因子1*因子2*……*因子k
的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。输入样例:
630
输出样例:
3 5*6*7
lz在做这个牛马题目的时候已经被逼疯了,柠檬出题的在给测试点的时候能不能把格式给清楚?
乍一看题目:连续因子
630 = 3*5*6*7 输出连续因子序列3 连续因子5*6*7 这不就是求n能分解成最多多少个连续整数的乘积吗?
果断提交:
from math import *
n = eval(input())
m = 1
ls = []
for i in range(2,int(sqrt(n))+1):
temp = n
if temp%i==0:
temp/=i
flag = 1
length = 1
while(flag):
i+=1
if temp%i == 0:
length+=1
temp/=i
else:
flag = 0
if m < length:
m = length
ls = [str(i) for i in range(i-length,i)]
print(m)
print('*'.join(ls))
果然,四个答案错误???
转念一想,万一给的数是质数,只能分解成1和它本身怎么办?又一看有三个只有1分的测试点,不过捏马这鸟题目上面也没给出质数的输出格式啊???上网一搜,不出所料,这byd真给了三个全是质数的测试点,输出格式为:
ex:7 1 \n 7
沉默......
好吧,姑且原谅你,就当你忘记给了,将代码略作调整
if ls == []:
if n%i==0:
print(1)
print(i)
结果还tm有一个2分的测试点没过......
我甚至用了半个小时质疑我前面写的算法的正确性,又上去搜一下关于测试点4的错法......
还是没看出来哪错了
最后彻底疯狂,手动二分查找猜测试点!测试点大于100报错类型为运行超时;小于100报错类型为答案错误,最后试出测试点为899
int main() {
int a;
scanf("%d",&a);
if(a<=100){
printf("test");
}
else{
while(1);
}
return 0;
}
用正确代码跑:899 1 \n 29
.......
你要最小因子不会tmd直说吗,你899都没有连续因子,请问你要我单独给你算出来两个毫无作用的因子29*31干嘛呢?所以出题人设置这么一个测试点的目的是什么?纯纯考我阅读理解嘛,真谢谢你,求求你下次学好语文再来出题,把测试点形式表述清楚一点........
最后附上ac代码:
from math import *
n = eval(input())
m = 1
ls = []
for i in range(2,int(sqrt(n))+1):
temp = n
if temp%i==0:
temp/=i
flag = 1
length = 1
while(flag):
i+=1
if temp%i == 0:
length+=1
temp/=i
else:
flag = 0
if m < length:
m = length
ls = [str(i) for i in range(i-length,i)]
if m != 1:
print(m)
print('*'.join(ls))
if ls == []:
for i in range(2, int(sqrt(n)) + 1):
if n%i==0:
print(1)
print(i)
break
else:
print(1)
print(n)