鱼C论坛

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

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

[复制链接]
发表于 2020-11-5 13:57:41 | 显示全部楼层
num ="7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"
re = []
sum = []
for index in range(len(num)-12 ):
    i = ''
    for n in range (13):
        i += num[index + n]
    re.append(i)
for each in re:
    count = 1
    for items in each[:13]:
        count = count * int(items)
        sum.append(count)



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

使用道具 举报

发表于 2021-3-6 16:27:44 | 显示全部楼层
  1. #include <stdio.h>


  2. main()
  3. {
  4.         char a[1000] = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";

  5.         int i, j, num;
  6.         long long int sum = 1, max = 0;
  7.         for (i = 0; i < 1000; i++)
  8.         {
  9.                
  10.                 for (j = i; j < (i + 13); j++)
  11.                 {
  12.                         if (a[j] == '0')
  13.                         {
  14.                                 i = j;
  15.                                 goto Label;
  16.                         }
  17.                         else
  18.                         {
  19.                                 num = a[j] - 48;
  20.                                 sum *= num;
  21.                         }
  22.                 }
  23.                 max = max > sum ? max : sum;

  24.         Label:sum = 1;

  25.         }
  26.         printf("\n%lld\n", max);
  27. }
复制代码

大佬帮帮看看有没问题!!!谢谢大佬!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-7 23:35:04 From FishC Mobile | 显示全部楼层
a1351468657 发表于 2021-3-6 16:27
大佬帮帮看看有没问题!!!谢谢大佬!

i要是能取到1000, 说不定就得内存越界。得亏数据最后一位是0。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-5 16:53:38 | 显示全部楼层
  1. n=list(num)#数字太大就不复制过来了
  2. result=[]
  3. for i in range(0,len(n)-12):
  4.     j=int(n[i])*int(n[i+1])*int(n[i+2])*int(n[i+3])*int(n[i+4])*int(n[i+5])*int(n[i+6])*int(n[i+7])*int(n[i+8])*int(n[i+9])*int(n[i+10])*int(n[i+11])*int(n[i+12])
  5.     result.append(j)
  6. print(max(result))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-9 00:49:17 | 显示全部楼层
C处理是块,但是python方便,搁以前我肯定用python
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-10 20:46:55 | 显示全部楼层
  1. #include <stdio.h>

  2. static char target[1000] = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";

  3. int main(void)
  4. {
  5.         int i,j;
  6.         char (*p)[1000] = &target;
  7.         long long int multiply_result;
  8.         long long int max = 1;
  9.         int max_j;
  10.        
  11.         for(i=0;i<1000-13;i++)
  12.         {
  13.                 multiply_result = 1;
  14.                 for(j=i;j<i+13;j++) multiply_result *= ((*p)[j]-48);
  15.                 if (multiply_result > max)
  16.                 {
  17.                         max = (multiply_result > max)?multiply_result:max;
  18.                         max_j = i;
  19.                 }
  20.         }
  21.        
  22.         printf("result is %lld\n", max);
  23.         for(i=0;i<13;i++) printf("%c", (*p)[max_j+i]);
  24.         return 0;
  25. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-10 16:19:35 | 显示全部楼层
from math import *
num = 7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450

s = str(num)
s = s.replace('0', ' ')
total = []
each = []
for i in s:
    if i != ' ':
        each.append(int(i))
    else:
        total.append(each)
        each = []
        continue
#检测去0
'''
for i in total:
    print(i, end = '\n')
'''

result1 = []
for x in total:
    if len(x) >= 13:
        result1.append(x)
#检测小于13的项
'''
for i in result1:
    print(i, end = '\n')
'''
biggest = []      
result = []
sres = ''
for i in result1:
    #求长度刚好为13的项
    if len(i) == 13:
        res = prod(i)
        result.append(res)
        result = [max(result)]
        if res == max(result):
            biggest = i
        '''
        print("刚好13")
        print("待计算:", i)
        print("乘积:", res)
        print("比较后较大的是:", result)
        print("最大的字符:", biggest)
        print("=========================")
        '''
    #求当长度大于13的项
    elif len(i) > 13:
        '''
        print("大于13,开始轮!")
        '''
        a = 0
        b = 13
        while True:
            #从第一个开始每13个作为一项计算
            sres = i[a:b]
            res = prod(sres)
            '''
            print("待计算:", sres)
            print("乘积:", res)
            '''
            result.append(res)
            result = [max(result)]
            if res == max(result):
                biggest = sres
            '''
            print("比较后较大的是:", result)
            print("最大的字符:", biggest)
            print("=========================")
            '''
            a += 1
            b += 1
            if b == len(i) + 1:
                break
#打印结果
str1 = ''
for i in biggest:
    str1 += str(i)
print("连续13个数字的最大乘积是:%s" % str1)
print("乘积是%s" % str(res))



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

使用道具 举报

发表于 2022-1-28 20:56:07 | 显示全部楼层
  1. char *num = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
  2. #include <cstdio>
  3. int main()
  4. {
  5.     long long max = 0;
  6.     for(int i=0;i<1000-13;i++)
  7.     {
  8.         long long current = 1;
  9.         for(int j=i;j<i+13;j++)
  10.         {
  11.             current *= num[j] -48;
  12.         }
  13.         if(current>max)
  14.             max = current;
  15.     }
  16.     printf("%lld",max);
  17. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-18 15:52:16 | 显示全部楼层
本帖最后由 B1tetheDust 于 2022-3-18 15:53 编辑
  1. import time

  2. test_num = '''73167176531330624919225119674426574742355349194934
  3. 96983520312774506326239578318016984801869478851843
  4. 85861560789112949495459501737958331952853208805511
  5. 12540698747158523863050715693290963295227443043557
  6. 66896648950445244523161731856403098711121722383113
  7. 62229893423380308135336276614282806444486645238749
  8. 30358907296290491560440772390713810515859307960866
  9. 70172427121883998797908792274921901699720888093776
  10. 65727333001053367881220235421809751254540594752243
  11. 52584907711670556013604839586446706324415722155397
  12. 53697817977846174064955149290862569321978468622482
  13. 83972241375657056057490261407972968652414535100474
  14. 82166370484403199890008895243450658541227588666881
  15. 16427171479924442928230863465674813919123162824586
  16. 17866458359124566529476545682848912883142607690042
  17. 24219022671055626321111109370544217506941658960408
  18. 07198403850962455444362981230987879927244284909188
  19. 84580156166097919133875499200524063689912560717606
  20. 05886116467109405077541002256983155200055935729725
  21. 71636269561882670428252483600823257530420752963450'''

  22. test_num = test_num.replace('\n', '')
  23. start = time.perf_counter()
  24. length_num = len(test_num)
  25. max_mult = 0
  26. ord_num = 0
  27. while ord_num < length_num:
  28.     mult = 1
  29.     if '0' in test_num[ord_num: ord_num+13]:
  30.         ord_num += (test_num[ord_num: ord_num+13].index('0') + 1)
  31.         continue
  32.     for i in test_num[ord_num: ord_num+13]:
  33.         mult *= int(i)
  34.     if mult > max_mult:
  35.         max_mult = mult
  36.     ord_num += 1
  37. print(max_mult)
  38. print('It costs %f s' % (time.perf_counter() - start))
复制代码

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

使用道具 举报

发表于 2022-8-9 17:34:08 | 显示全部楼层
  1. pub fn run() -> Result<(), Box<dyn std::error::Error>> {
  2.     let number = [
  3.         "73167176531330624919225119674426574742355349194934",
  4.         "96983520312774506326239578318016984801869478851843",
  5.         "85861560789112949495459501737958331952853208805511",
  6.         "12540698747158523863050715693290963295227443043557",
  7.         "66896648950445244523161731856403098711121722383113",
  8.         "62229893423380308135336276614282806444486645238749",
  9.         "30358907296290491560440772390713810515859307960866",
  10.         "70172427121883998797908792274921901699720888093776",
  11.         "65727333001053367881220235421809751254540594752243",
  12.         "52584907711670556013604839586446706324415722155397",
  13.         "53697817977846174064955149290862569321978468622482",
  14.         "83972241375657056057490261407972968652414535100474",
  15.         "82166370484403199890008895243450658541227588666881",
  16.         "16427171479924442928230863465674813919123162824586",
  17.         "17866458359124566529476545682848912883142607690042",
  18.         "24219022671055626321111109370544217506941658960408",
  19.         "07198403850962455444362981230987879927244284909188",
  20.         "84580156166097919133875499200524063689912560717606",
  21.         "05886116467109405077541002256983155200055935729725",
  22.         "71636269561882670428252483600823257530420752963450",
  23.     ]
  24.     .concat()
  25.     .chars()
  26.     .filter_map(|x| x.to_digit(10))
  27.     .collect::<Vec<_>>();
  28.     let mut max = 0u64;
  29.     for i in 0..987 {
  30.         let mut value = 1u64;
  31.         for j in 0..13 {
  32.             if number[i + j] == 0 {break;}
  33.             value *= number[i + j] as u64;
  34.         }
  35.         if value > max {
  36.             max = value
  37.         }
  38.     }
  39.     println!("{max}");
  40.     Ok(())
  41. }
复制代码

[Project Euler 8]
23514624000
[Task finished in 0.0012772s]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-29 00:47:47 | 显示全部楼层

while是死循环啊,你没法跳出while
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-1 23:28:40 | 显示全部楼层
  1. import time

  2. start = time.time()
  3. number = """7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"""
  4. num_dict = {}


  5. def calculate(n):
  6.     result = 1
  7.     for digit in n:
  8.         result *= int(digit)
  9.     return result


  10. for i in range(1000):
  11.     cut_number = number[i:i + 13]
  12.     if str(0) in cut_number:
  13.         continue
  14.     else:
  15.         total = calculate(cut_number)
  16.         num_dict.setdefault(cut_number, int(total))

  17. max_value = max(num_dict.values())

  18. max_key = [key for key, value in num_dict.items() if value == max_value]

  19. print(f'max_key = {max_key}, max_value = {max_value}')
  20. end = time.time()
  21. print(f'time:{end - start}')
复制代码

max_key = ['5576689664895'], max_value = 23514624000
time:0.0009989738464355469
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 17:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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