谴责牛马PAT题目:L1-006 连续因子

一个正整数 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)

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值