鱼C论坛

 找回密码
 立即注册
楼主: 欧拉计划

题目8:找出这个1000位数字中连续13个数字乘积的最大值

[复制链接]
发表于 2017-2-21 22:29:22 | 显示全部楼层
python 好多 c好少
/*找出一下1000位的整数中连续13个数字的最大乘积*/

#include<stdio.h>

typedef unsigned long long  ull;

char a[]={"7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"};
char *p = a;

ull mul(char *ch)  //13个数的乘积
{
    int i = 13;
    ull t = 1;
    while(i--)
    {
        t = t *  (*(ch+i) - 48);
    }
    return t;
}

int main()
{
    ull max = 0;
    int i = 0;
    while(i <= 987)
    {
        max = max < mul(p) ? mul(p) : max;
        p++;
        i++;
    }
    printf("%llu", max);
   return 0;
}
23514624000
Process returned 0 (0x0)   execution time : 0.030 s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-22 14:50:30 | 显示全部楼层
date_0 = """73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450"""
# 干掉有零的分片,把没有的做乘再比较

date = []
for a in date_0.split():     #去回车,重整数据为 整数 然放入一个列表date
    for b in a :
        date.append(int(b))

def chengji(list):       # 给出分片做乘积
    num = 1
    for i in list:
        num *= i
    return  num

def find_zero(list):       # 找零,无零回 True, 有零False
    for j in list :
        if j == 0 :
            return False
    return  True

aw = 1
for k in range(0, len(date)-13):
    list_pian = []
    for n in date[k: ( k + 13)] :       # 分片
        list_pian.append(n)
        if find_zero(list_pian) :  # 无零做积
            m = chengji(list_pian)
            if m > aw:
                aw = m
print("答案是: " + str(aw))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-1 18:43:11 | 显示全部楼层
思路:
只要13个数字中有零就可以直接略过,, 根据这个,,, 我们用0把这个字符串分片
然后找出长度大于13的的列表,, 只要在这些列表里面找就好了
#找出以下这个 1000 位的整数中连续 13 个数字的最大乘积。
num='''
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450'''

numlen=13

def prolist(list):
        result=1
        for i in list:
                result = result*int(i)
        return result
import time
start=time.time()
num=num.replace("\n","")
numlist=(list(num))
zerolist=num.split('0')
maxpro=0
for list in zerolist:
        listlen=len(list)
        if listlen<numlen:
                continue
        else:
                for i in range(1,listlen-(numlen-2)):
                        maxpro=max(maxpro,prolist(list[i:i+numlen]))
print(maxpro)
print("used:%.8fs" % (time.time()-start))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-2 11:54:31 | 显示全部楼层
1000个数字,禁止复制,我谢谢版主了,我的想法是先用0截断,分成多个字符串,小于13个的直接舍弃,留下了正好13的直接乘出结果,大于13的按顺序乘出结果,每次算的时候记录下对应的13个数,通过乘出来的结果对比,打印出最大的并找出对应的13位数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-14 16:44:31 | 显示全部楼层
str0='7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450'
max1=0
for i in range(0,1000-13):
    str1 = str0[i:13+i]
    mul =1
    for j in range(0,13):
        mul=mul*int(str1[j])
    if max1<mul:
        max1=mul
        str2=str1[:]
        num=i
print(max1)
print(list(str2))
结果:>>>
23514624000
['5', '5', '7', '6', '6', '8', '9', '6', '6', '4', '8', '9', '5']
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-14 16:48:42 | 显示全部楼层
本帖最后由 99592938 于 2017-3-14 16:51 编辑
余欲渔 发表于 2017-3-2 11:54
1000个数字,禁止复制,我谢谢版主了,我的想法是先用0截断,分成多个字符串,小于13个的直接舍弃,留下了 ...


哈哈,浏览器有复制,不要用右键或快捷键。另外你的想法对大数据很好用,1000个数字不需用这样吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-28 15:35:15 | 显示全部楼层
23514624000
#include <stdio.h>
#include <string.h>

int main(void)
{
    char nums[] = {"316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"};

    int i = 0, j;
    long result = 0, temp = 1;

    for(i = 0; i < strlen(nums) - 13; i++)
    {
        if((nums[i + 12] - '0') == 0)
        {
            i += 13;
        }
        else
        {
            for(j = 0; j < 13; j++)
            {
                temp *= nums[i + j] - '0';
            }

            if (temp > result)
            {
                result = temp;
            }

            temp = 1;
        }
    }

    printf("%ld\n", result);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-28 15:42:11 | 显示全部楼层
def main():
    nums = '''316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450'''

    result = 0
    temp = 1

    for i in range(len(nums) - 12):
        if int(nums[i + 12]) == 0:
            i += 13
        else:
            for j in range(13):
                temp *= int(nums[i + j])

            if temp > result:
                result = temp

            temp = 1

    print(result)

if __name__ == "__main__":
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-30 17:43:23 | 显示全部楼层
#-*- coding:utf-8 -*-
def StrToList(mystr,length):
    listTmp = []
    for i in range(0,len(mystr) - length +1):
        listTmp.append(int(mystr[i:i + length]))
        print(listTmp)
    return listTmp
#数组
mystr = '7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450'
lastList = []  
#将数组拆分成13位的列
mylist = StrToList(mystr,13)

lastList = []

for each in mylist:
    p = 1
    for i in (str(each)):
        p *= int(i)
    lastList.append(p)

print(max(lastList))

结果是23514624000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-5 23:30:32 | 显示全部楼层
结果:70573265280
代码个人觉得还算比较简洁的,如下:
from functools import reduce

num = 7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450

a = []

def calc(li):  //遍历连续的13位,计算其乘积并放入a列表中
  n=0
  while n+13 <= len(li):
    a.append(reduce(lambda x,y: int(x)*int(y), li[n:n+13+1]))
    n += 1

for i in list(filter(lambda a: len(a)>=13, str(num).split('0'))): //将大数转成字符串并用0和有连续13个非0数来分割
  calc(i)

print(sorted(a), sorted(a)[-1])  //排序并打印出最大的数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-23 19:46:35 | 显示全部楼层
Python,感觉不够简练
#找出下列1000位的整数中连续13个数字的最大乘积
number = '''73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450'''

number = number.strip()
number = number.replace('\n','')

number = number.split('0')
number13 = []
for each in number:
    if len(each) >= 13:
        number13.append(each)

def max13(numberlist):
    maxium = dict()
    for eachs in numberlist:
        for i in range(len(eachs)-12):
            x = eachs[i:i+13]
            maxium.setdefault(x,1)
            product = 1
            for each in x:
                product *= int(each)
            if product > maxium[x]:
                maxium[x] = product
    ss = ''
    mm = 1
    for eachs in maxium:
        if maxium[eachs] > mm:
            ss = eachs
            mm = maxium[eachs]

    print('该1000位的整数连续13个数字的最大乘积为:%d;这13个数为:%s'%(mm,ss))


max13(number13)

结果:该1000位的整数连续13个数字的最大乘积为:23514624000;这13个数为:5576689664895
时间:0.00500178337097168s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-30 23:00:06 | 显示全部楼层
本帖最后由 天之南 于 2017-4-30 23:03 编辑
#include<stdio.h>

int main()
{
        char str[] = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
        int l = strlen(str);
        long long max = 0;
        int start = 0;
        for (int i = 0;i + 13 < l;i++)
        {
                long long x = 1;
                for (int j = 0;j < 13;j++)
                {
                        x*=(str[i + j]-48);
                }
                if (max < x)
                {
                        max = x;
                        start = i;
                }
        }
        printf("%d", str[start] - 48);
        for (int j = start + 1;j < start+13;j++)
        {
                printf("×%d", str[j]-48);
        }
        printf("=%lld\n", max);
        
        return 0;
}

5×5×7×6×6×8×9×6×6×4×8×9×5=23514624000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-4 18:09:56 | 显示全部楼层
答案是23514624000
我这个可以自定义找到数字的间距
#include<stdio.h> 

//节省运算关键在于找0,找到0则两侧12个都不用计算了。 
int main(void)
{        
        int i,gap,num[1000],pt;//point作为在数组里面走的探针 
        int rst=1,tmp=1;
        char str[]="73167176531330624919225119674426574742355349194934\
96983520312774506326239578318016984801869478851843\
85861560789112949495459501737958331952853208805511\
12540698747158523863050715693290963295227443043557\
66896648950445244523161731856403098711121722383113\
62229893423380308135336276614282806444486645238749\
30358907296290491560440772390713810515859307960866\
70172427121883998797908792274921901699720888093776\
65727333001053367881220235421809751254540594752243\
52584907711670556013604839586446706324415722155397\
53697817977846174064955149290862569321978468622482\
83972241375657056057490261407972968652414535100474\
82166370484403199890008895243450658541227588666881\
16427171479924442928230863465674813919123162824586\
17866458359124566529476545682848912883142607690042\
24219022671055626321111109370544217506941658960408\
07198403850962455444362981230987879927244284909188\
84580156166097919133875499200524063689912560717606\
05886116467109405077541002256983155200055935729725\
71636269561882670428252483600823257530420752963450";

        for(i=0;i<1000;++i)
                num[i]=(int)str[i]-48;
        printf("data loading success!\nenter thr gap:\t");
        scanf("%d",&gap);
        pt = gap;

while(pt<1000)
        {

relocate:
                tmp=1;
                for(i=pt-gap;i<pt;++i)        tmp=tmp*num[i];
                if(tmp==0)
                {
                        pt++;
                        goto relocate;        //为0表示跳过的位置里面有0 
                }
        
                if(tmp>rst)        rst=tmp;
                while(num[pt])
                {
                        tmp /= num[pt-gap];
                        tmp *= num[pt];
                        if(tmp>rst)        rst=tmp;
                        pt++;
                }
                pt += (gap+1);
        }
        
        printf("%d\n",rst); 
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-7 17:18:57 | 显示全部楼层
public static void main(String[] args) {
                String str = "7316717653133062491922511" +
                                "9674426574742355349194934969835" +
                                "20312774506326239578318016984801869" +
                                "478851843858615607891129494954595017" +
                                "379583319528532088055111254069874715852" +
                                "3863050715693290963295227443043557668966" +
                                "48950445244523161731856403098711121722" +
                                "38311362229893423380308135336276614282" +
                                "80644448664523874930358907296290491560" +
                                "4407723907138105158593079608667017242" +
                                "7121883998797908792274921901699720888" +
                                "0937766572733300105336788122023542180" +
                                "9751254540594752243525849077116705560" +
                                "1360483958644670632441572215539753697" +
                                "8179778461740649551492908625693219784" +
                                "686224828397224137565705605749026140797" +
                                "296865241453510047482166370484403199890008895243450" +
                                "65854122758866688116427171479924442928230863465674813" +
                                "9191231628245861786645835912456652947654568284891288314" +
                                "26076900422421902267105562632111110937054421750694165896" +
                                "04080719840385096245544436298123098787992724428490918884" +
                                "580156166097919133875499200524063689912560717606058861164" +
                                "671094050775410022569831552000559357297257163626956188267" +
                                "0428252483600823257530420752963450";
                String ss[]=str.split("0");
                List<String> zz=new ArrayList<String>();
                for(String ssz:ss){
                        if(ssz.length()>13){
                                zz.add(ssz);
                        }
                }
                List<int[]> arr=new ArrayList<int[]>();
                for(int j=0;j<zz.size();j++){
                        String num=zz.get(j);
                        int sums[]=new int[num.length()];
                        int sum=1;
                        for(int i=0;i<num.length();i++){
                                sums[i]=Integer.parseInt(new String(new char[]{num.charAt(i)}));
                        }
                        arr.add(sums);
                }
                long max=0;
                int number[]=new int[13];
                for (int[] is : arr) {
                        for (int i=0;i<is.length-12;i++) {
                                long sum=1;
                                for (int j = i; j <i+13; j++) {
                                        sum*=is[j];
                                }
                                if(sum>max){
                                        max=sum;
                                        int x=0;
                                        for (int j = i; j <i+13; j++) {
                                                number[x]=is[j];
                                                x++;
                                        }
                                }
                        }
                }
                System.out.println(max);
                for (int i : number) {
                        System.out.println(i);
                }
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-23 19:41:14 | 显示全部楼层
为什么我的是3780710640
#include <stdio.h>
#include <string.h>

//euler 8

int main(void){
        
        int i, j;
        
        unsigned long int max = 0;
        unsigned long n = 1;
        
        char str[] = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
        
        int len = strlen(str);
        
        for (i = 0; i < len - 13; i++){
                for (j = 0; j < 13; j++){
                        n *= str[i+j] - '0';
                }
                if (n > max){
                        max = n;
                }
                n = 1;
        }
        
        printf("%lld", max);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-12 14:26:15 | 显示全部楼层
target = '''73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450'''


s = target.replace('\n','')
total = 0
for i in range(987):
    mutiple = 1
    for j in range(13):
        mutiple *= int(s[i+j])
        if not mutiple:
            break
    total = max(mutiple,total)

print(total)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 11:31:18 | 显示全部楼层
AArdio编写:
import console;
import time.timer
 
console.setTitle("Test");

time.timer.start();

var s = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"

function tolist(s) begin
    var tab = {}
    for i=1;#s begin
        table.push(tab,string.sub(s,i,i));
    
    end;
    return tab

end;

var list = tolist(s);
var max = 0;
for i=1;#list-12 begin
    var tmp = 1
    for j=0;12 begin
        tmp *= tonumber(list[i+j])
    
    end;
    max = math.max(max,tmp)

end;

console.print(max);

console.print(time.timer.endTick(), '毫秒');

23514624000
3.714270055294  毫秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-19 22:30:37 | 显示全部楼层
#include<stdio.h>
#include<stdlib.h>
#define NUM 1001
int compare(int m[],int max[],int digit,int now)
{
        int i=now;
        if(digit>now)
        {
                return 1;
        }
        else if(digit==now)
        {
                for(;i>=0;i--)
                {
                        if(m[i]>max[i])
                        {
                                return 1;
                        }
                }
                return 0;
        }
        else
                return 0;
}
int main(void)
{
        FILE *fp;
        char num[NUM];
        int  n[NUM],t[13],m[20],max[20]={0};
        int i,j,temp,k=0,start,carry,digit=1,now=7;
        if(!(fp=fopen("1.txt","r")))
        {
                printf("读写错误!");
                exit(1);
        }
        fgets(num,NUM,fp);
        for(i=0;i<NUM-1;i++)
        {
                n[i]=num[i]-'0';
                printf("%d",n[i]);
        }
        printf("\n");

        for(i=0;i<NUM-13;i++)
        {
                m[0]=1;
                digit=1;
                for(k=1;k<20;k++)
                {
                        m[k]=0;
                }

                for(j=i;j<i+13;j++)
                {
                        for(k=1,carry=0;k<=digit;k++)
                        {
                                temp=m[k-1]*n[j]+carry;
                                m[k-1]=temp%10;
                                carry=temp/10;
                        }
                        while(carry)
                        {
                                        m[++digit-1]=carry%10;
                                        carry=carry/10;
                        }
                }

                if(compare(m,max,digit,now))
                {
                        now=digit;
                        for(k=0;k<20;k++)
                        {
                                max[k]=m[k];        
                        }
                        k=0;
                        start=i;
                        for(j=i;j<i+13;j++)
                        {
                                t[k]=n[j];
                                k++;
                        }
                }

        }

        printf("\n从第%d开始\n",start);
        for(k=now-1;k>=0;k--)
        {
                printf("%d",max[k]);
        }
        printf("\n");
        for(k=0;k<13;k++)
        {
                printf("%d  ",t[k]);
        }
        printf("\n");
        fclose(fp);
        system("pause");
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-27 15:17:52 | 显示全部楼层
import time


series = '''
7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450'''


def product(str1):
    result = 1
    if '0' in str1:
        return 0
    else:
        for i in str1:
            result *= int(i)
        return result


start = time.time()
maxresult = product(series[1:14])
for i in range(2, len(series) - 13):
    str1 = series[i:i+13]
    maxresult = max(maxresult, product(str1))
print maxresult
print time.time() - start

还有可优化的点是,如果新加入的数比之前剔除的数小,那么新的这组数的乘积就不用算了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

匿名鱼油  发表于 2018-3-27 16:23:54
<url>http://canadianpharmaciesrxbest.com/|pharmacy online</url>, <url>http://canadianonlinepharmacygen.com/|canadian drugstore online</url>, <url>http://canadianpharmaciesdiscount.com/|discount pharmacy</url>, <url>http://canadianpharmacieslink.com/|ed meds online</url>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 05:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表