鱼C论坛

 找回密码
 立即注册
查看: 2674|回复: 14

题目56:对于形如a的b次方的数字,找出最大的各位和

[复制链接]
发表于 2015-6-18 23:31:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

Powerful digit sum

A googol QQ20150618-1@2x.png is a massive number: one followed by one-hundred zeros; QQ20150618-2@2x.png is almost unimaginably large: one followed by two-hundred zeros. Despite their size, the sum of the digits in each number is only 1.

Considering natural numbers of the form, QQ20150618-3@2x.png , where a, b < 100, what is the maximum digital sum?

题目:

一个 googol QQ20150618-1@2x.png 是一个巨大的数字:1 后面跟着 100 个 0; QQ20150618-2@2x.png 几乎是不可想象的大:1 后面跟着 200 个 0。它们虽然很大,但是它们的各位数之和却只有 1。

考虑形如 QQ20150618-3@2x.png 的数, 其中 a, b < 100,最大的各位和是多少?

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

使用道具 举报

发表于 2016-8-31 10:41:43 | 显示全部楼层
最大的是  99的95次方   各位数的和是972
  1. int getResult(string &str)
  2. {
  3.         //将str各位加起来
  4.         int re=0;
  5.         for (int n =0;n<str.size();n++)
  6.                 re+=str[n]-'0';
  7.         return re;
  8. }
  9. int main()
  10. {
  11.        
  12.         int max=0;

  13.         //记录下指数和底数
  14.         int zhi,di;
  15.         for (int z=2;z<=100;z++)
  16.         {
  17.                 for (int k=2;k<=100;k++)
  18.                 {
  19.                         //底数是z  指数是k
  20.                         char buf[20];
  21.                         itoa(z,buf,10);
  22.                         strcat(buf,".0");
  23.                         string result;
  24.                         result = BigNum_factorial(buf,k); //大数幂
  25.                         int n=getResult(result);
  26.                         if(n>max)
  27.                    {
  28.                            zhi=k;
  29.                             di=z;
  30.                            max=n;
  31.                         }
  32.                 }
  33.         }
  34.         std::cout<<max<<endl<<di<<endl<<zhi<<endl;
  35.         return 0;
  36. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-7 15:24:02 | 显示全部楼层
  1. 最大各位和是99的95次方得到的972

  2. '''求a**b 的各位和最大值'''
  3. maxi,maxa,maxb = 0,0,0
  4. for a in range(99,1,-1):
  5.         for b in range(99,1,-1):
  6.                 summ = 0
  7.                 test = str(a**b)
  8.                 for each in test:
  9.                         summ += int(each)
  10.                 if maxi < summ:
  11.                         maxi,maxa,maxb = summ,a,b
  12. print ('最大各位和是%d的%d次方得到的%d' % (maxa,maxb,maxi))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-22 00:42:27 | 显示全部楼层
  1. def Figure(a,b):
  2.     temp = a**b
  3.     count = 0
  4.     for each in str(temp):
  5.         count +=int(each)
  6.     return count
  7. temp = 0
  8. for i in range(1,100):
  9.     for j in range(1,100):
  10.         sum1 = Figure(i,j)
  11.         if sum1 > temp:
  12.             temp = sum1
  13. print(temp)
复制代码

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

使用道具 举报

发表于 2017-1-17 15:14:07 | 显示全部楼层
  1. # encoding:utf-8
  2. # a,b<100,计算a**b各位数之和最大的
  3. from time import time
  4. def euler056(N=1000000):
  5.     maxsum = 0
  6.     a, b = 0, 0
  7.     for i in range(1, 100):
  8.         for j in range(1, 100):
  9.             t = sum(int(x) for x in str(i ** j))
  10.             if t > maxsum:
  11.                 maxsum = t
  12.                 a, b = i, j
  13.     print(maxsum, a, b)
  14. if __name__ == '__main__':
  15.     start = time()
  16.     euler056()
  17.     print('cost %.6f sec' % (time() - start))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-21 20:14:02 | 显示全部楼层
本帖最后由 飘飞的白杨 于 2017-1-23 16:28 编辑
  1. y = 0
  2. for i in range(1,101):
  3.     for j in range(1,101):
  4.         x = sum([int(n) for n in str(i**j)])
  5.         y = max(x, y)
  6. print(y)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-16 22:17:41 | 显示全部楼层
本帖最后由 渡风 于 2017-6-18 11:53 编辑

在此吐槽MATLAB vpa的大数计算精度。算法没错。结果错了
此代码使用matlab和Python编程
Problem56所用时间为: 1.1116秒
Problem56的答案为: 972
  1. % 最后编辑时间:17-06-18 12:15
  2. % 0 <a,b<100 a^b 所有位数相加起来最大的那个数是?
  3. % 解决要点,使用Python 和 MATLAB 联合编程
  4. % Problem56所用时间为: 2.2817秒
  5. % Problem56的答案为: 972

  6. function Output = Problem56()
  7. tic
  8. Output = 0;
  9. bottom = 0;
  10. power = 0;
  11. for a = 99:-1:1
  12.     for b = 99:-1:1
  13.          Score = py.Fun56.PowTotal(int32(a),int32(b));  %调用Python函数
  14.         if Score > Output         
  15.             Output = Score ;
  16.             disp(Output)
  17.             bottom = a;
  18.             power = b;
  19.         end
  20.     end
  21. end
  22. disp(bottom)
  23. disp(power)                                    
  24. toc
  25. disp('此代码使用matlab和Python编程')
  26. disp(['Problem56所用时间为: ',num2str(toc),'秒'])
  27. disp(['Problem56的答案为: ',char(Output)])
  28. end
复制代码


Python 文件
  1. #输入a , b 判断 a** b的所有位数的和
  2. def PowTotal(a,b):
  3.     Num = str(a**b)
  4.     Vec = [int(x) for x in Num ]
  5.     Sum = sum(Vec)
  6.     return Sum
  7. #end
复制代码

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

使用道具 举报

发表于 2017-10-1 17:06:01 | 显示全部楼层
用的matlab计算
结果是
   972

时间已过 4.927415 秒。
>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-8 15:57:35 | 显示全部楼层
972

  1. def digital_sum(num):
  2.     sum = 0
  3.     for each in str(num):
  4.         sum += int(each)
  5.     return sum

  6. sum = 1
  7. for i in range(1, 100):
  8.     for j in range(1,100):
  9.         if digital_sum(pow(i, j)) > sum:
  10.             sum = digital_sum(pow(i, j))

  11. print(sum)
复制代码




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

使用道具 举报

发表于 2019-6-25 16:45:56 | 显示全部楼层
最大a的b次方的数字各位和是:972
用时:0.4212027 秒
  1. import time

  2. result = []
  3. for a in range(2, 100):
  4.     for b in range(1, 100):
  5.         result.append(sum([int(letter) for letter in str(a**b)]))
  6. print("最大a的b次方的数字各位和是:{}\n用时:{} 秒".format(max(result), time.process_time()))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-28 17:00:30 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-8-19 11:02 编辑
  1. print(max(sum(map(int, str(a ** b))) for a in range(100) for b in range(100)))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-19 10:31:39 | 显示全部楼层
972

Process returned 0 (0x0)   execution time : 0.942 s
Press any key to continue.
高精度乘法
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. using namespace std;

  6. const int M = 100;
  7. int pw[250];

  8. void ini_pw(){
  9.   memset(pw,0,sizeof(pw));
  10.   pw[0] = 1;
  11. }

  12. int mult(int x){
  13.   for (int i = 0;i < 200;i++){
  14.     pw[i] *= x;
  15.   }
  16.   for (int i = 0;i < 200;i++){
  17.     pw[i+1] += pw[i] / 10;
  18.     pw[i] %= 10;
  19.   }
  20.   int res = 0;
  21.   for (int i = 0;i < 200;i++){
  22.     res += pw[i];
  23.   }
  24.   return res;
  25. }

  26. int main(){
  27.   int ans = 0;

  28.   for (int a = 2;a < M;a++){
  29.     for (int b = 2;b < M;b++){
  30.       ini_pw();

  31.       for (int i = 0;i < b;i++){
  32.         ans = max(mult(a),ans);
  33.       }
  34.     }
  35.   }
  36.   cout << ans << endl;
  37.   return 0;
  38. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-28 00:57:14 | 显示全部楼层
99的95次方最大,各位和为972
  1. def he(n):
  2.     return sum(int(i) for i in str(n))

  3. max1 = 0
  4. for a in range(1,100):
  5.     for b in range(1,100):
  6.         if he(a**b) > max1:
  7.             a1 = a
  8.             b1 = b
  9.             max1 = he(a**b)

  10. print('%d的%d次方最大,各位和为%d' % (a1,b1,max1))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-9 10:31:04 | 显示全部楼层
直接调用大数库mpir.
  1. /*
  2. 欧拉问题56
  3. 答案:972
  4. 耗时:0.005703秒(单核)
  5.       0.001556秒(6核)
  6. */
  7. #include <cstdio>
  8. #include <mpir.h>
  9. #include <omp.h>
  10. #include <cstring>

  11. int main(void)
  12. {
  13.   int k = omp_get_max_threads();
  14.   mpz_t* mb = new mpz_t[k];
  15.   int nMSum = 0;
  16. #pragma omp parallel reduction(max:nMSum) shared(mb)
  17.   {
  18.     int k = omp_get_thread_num();
  19.     mpz_init(mb[k]);
  20. #pragma omp for collapse(2)
  21.     for (int b = 2; b < 100; ++b)
  22.     {
  23.       for (int a = 2; a < 100; ++a)
  24.       {
  25.         int p = omp_get_thread_num();
  26.         mpz_ui_pow_ui(mb[p], b, a);
  27.         char str[256];
  28.         memset(str, 0, sizeof(str));
  29.         mpz_get_str(str, 10, mb[p]);
  30.         int lSum = 0;
  31.         for (int i = 0; i < (int)strlen(str); ++i)
  32.           lSum += int(str[i] - 48);
  33.         nMSum = (nMSum > lSum) ? nMSum : lSum;
  34.       }
  35.     }
  36.     mpz_clear(mb[k]);
  37.   }
  38.   delete[] mb;
  39.   printf_s("%d\n", nMSum);
  40.   return 0;
  41. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-8 17:10:09 | 显示全部楼层
  1. use rayon::prelude::*;
  2. use num::bigint::ToBigUint;
  3. use num::bigint::BigUint;
  4. use std::time::Instant;

  5. fn main() {
  6.     let now = Instant::now();
  7.     let num: u32 = (1..101u32)
  8.         .into_par_iter()
  9.         .map(|x| {
  10.             let a = x.to_biguint().unwrap();
  11.             (1..101u32)
  12.                 .into_par_iter()
  13.                 .map(|b| s(a.pow(b)))
  14.                 .max()
  15.                 .unwrap()
  16.         })
  17.         .max()
  18.         .unwrap();
  19.     println!("cost {}ms.", now.elapsed().as_millis());
  20.     println!("{:?}", num)
  21. }

  22. fn s(num: BigUint) -> u32 {
  23.     num
  24.         .to_string()
  25.         .bytes()
  26.         .map(|x| (x - 48) as u32)
  27.         .sum()
  28. }
复制代码

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 02:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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