鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 欧拉计划

题目16:2的1000次方的各位之和是多少?

[复制链接]
发表于 2020-6-28 18:43:14 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:00 编辑

此方法采用模拟手动计算乘法的方法

  1. #include<stdio.h>
  2. #include<stdlib.h>


  3. void main()
  4. {
  5.         int sum = 0;//用来统计计算结果各位之和
  6.         int count = 1;//用来记录strs数组被用了几位
  7.         int carry = 0;//carry用来保存进位
  8.         int i;
  9.         int strs[1000] = { 1 };//定义一个长度为1000的整型数组,并将strs[0]初始化为1,方便运算
  10.         for (i = 0; i < 1000; i++)//第一层循环保证每次结果乘以2,乘以1000次,即2^1000
  11.         {
  12.                 for (int j = 0; j < count; j++)//对已经使用的位,每次乘以2,手动模拟乘法
  13.                 {
  14.                         strs[j] = strs[j] * 2 + carry;//对数组的每一位处理,乘以2再加上进位
  15.                         carry = strs[j] / 10;//处理进位
  16.                         strs[j] %= 10;//每一位是一个0-9的数字
  17.                 }
  18.                 while (carry > 0)//上一个for循环结束,最高位可能还会产生进位,需要处理
  19.                 {
  20.                         strs[count++] = carry;//先将进位保存在数组
  21.                         if (strs[count - 1] > 9)//进位大于9,还需要进一步处理
  22.                         {
  23.                                 carry = strs[count - 1] / 10;//处理与上述模拟一样
  24.                                 strs[count - 1] %= 10;
  25.                         }
  26.                         else
  27.                         {
  28.                                 carry = 0;//不产生了进位,将进位置为0,以免产生影响
  29.                         }


  30.                 }
  31.                
  32.         }
  33.         printf("%d\n", count);//输出使用了多少位
  34.         printf("2^1000的结果为:\n");
  35.         for (i = count-1; i >= 0; i--)//从高位到低位输出结果
  36.         {
  37.                 printf("%d", strs[i]);
  38.         }
  39.         printf("\n");
  40.         for (i = count - 1; i >= 0; i--)//计算各位之和
  41.                 sum += strs[i];
  42.         printf("2^1000的各位数字之和 = %d\n",sum);//输出各位之和的结果



  43.         system("pause");//暂停一下
  44. }
复制代码

输出:
302
2^1000的结果为:
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
2^1000的各位数字之和 = 1366

点评

我很赞同!: 5.0
我很赞同!: 5
按 <> 发代码  发表于 2020-6-29 07:45
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-9 10:25:19 | 显示全部楼层
  1. '''2的1000次方的各位数加起来是多少?'''

  2. def sum_of_numbers(power):
  3.     number = 2 ** power
  4.     number_seqeuences = []
  5.     sum = 0
  6.     for each in str(number):
  7.         number_seqeuences.append(each)
  8.     for each in number_seqeuences:
  9.         sum += int(each)

  10.     print(number_seqeuences)
  11.     print(sum)

  12. start_sum_of_numbers = time.time()
  13. sum_of_numbers(1000)
  14. time_sum_of_numbers = time.time() - start_sum_of_numbers
  15. print("%f秒" %time_sum_of_numbers)
复制代码



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

使用道具 举报

发表于 2020-11-6 10:53:21 | 显示全部楼层

import math as m
def sum_pow(n):
    a = int (m.pow(2,n))
    a = str(a)
    count = 0
    for each in a:
        i = int(each)
        count = count + i
    return count

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

使用道具 举报

发表于 2021-3-7 22:41:25 | 显示全部楼层
JonTargaryen 发表于 2017-10-10 14:51
也不能说你们的答案不对,但是感觉欧拉计划里面的很多问题如果用Python就太简单了,尤其是当涉及到大数的时 ...

说的好, 太多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-8 09:52:15 | 显示全部楼层
本帖最后由 a1351468657 于 2021-3-8 09:53 编辑
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>


  4. main()
  5. {
  6.         int num = pow(2, 20);
  7.         char str[350], temp[350];
  8.         int len, i, j, k, a, b, c = 0;
  9.        
  10.         itoa(num, str, 10);

  11.        
  12.         for (i = 0; i < 980; i++)
  13.         {
  14.                 len = strlen(str);
  15.                 for (j = len - 1, k = 0; j >= 0; j--, k++)
  16.                 {
  17.                         a = str[j] - '0';
  18.                         a *= 2;
  19.                         b = (a + c) % 10;
  20.                         c = a / 10;

  21.                         temp[k] = b + '0';
  22.                 }
  23.                
  24.                 while (c)
  25.                 {
  26.                         temp[k] = c % 10 + '0';
  27.                         c /= 10;
  28.                         k++;
  29.                 }
  30.                 temp[k] = '\0';
  31.                
  32.                 for (j = k - 1, c = 0; j >= 0; j--, c++)
  33.                 {
  34.                         str[c] = temp[j];
  35.                 }
  36.                 str[k] = '\0';
  37.                 c = 0;       
  38.         }
  39.         len = strlen(str);
  40.         k = 0;
  41.         for (i = 0; i < len; i++)
  42.         {
  43.                 j = str[i] - '0';
  44.                 k += j;
  45.         }
  46.         printf("\n%d\n", k);
  47. }

复制代码

答案:1366
若有改进的地方望大佬指出!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-10 21:45:24 | 显示全部楼层
total = str(2 ** 1000)
sum = 0
for i in total:
    sum += int(i)
print(sum)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-29 11:55:31 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<math.h>

  3. #define Num  (pow(2,1000))

  4. int main(void)
  5. {
  6.         int sum = 0;
  7.                
  8.         for(int i = 1;i < Num;i+=10)
  9.         {
  10.                 sum += (Num / (i *10)) % i;
  11.         }
  12.        
  13.         printf("%d",sum);
  14.        
  15.         return 0;
  16. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-23 13:55:14 | 显示全部楼层
  1. import time as t

  2. start = t.perf_counter()
  3. print(sum([int(i) for i in str(2**1000)]))
  4. print("It costs %f s" % (t.perf_counter() - start))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-8 12:22:34 | 显示全部楼层
  1. use num::bigint::ToBigUint;
  2. use std::time::Instant;

  3. fn main() {
  4.     let now = Instant::now();
  5.     let num: i32 = 2
  6.         .to_biguint()
  7.         .unwrap()
  8.         .pow(1000)
  9.         .to_string()
  10.         .bytes()
  11.         .collect::<Vec<_>>()
  12.         .into_iter()
  13.         .map(|x| (x - 48) as i32)
  14.         .sum();
  15.     println!("cost {} ms.", now.elapsed().as_millis());
  16.     println!("{num}")
  17. }
复制代码

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

使用道具 举报

发表于 2023-6-18 15:57:21 | 显示全部楼层
我爱死c++了。^_^(呵呵)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-18 21:56:46 | 显示全部楼层
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
        int i,k,l,m=0;
        int sum=0;
        int array[1000]={0};
        array[0]=1;
        for(i=1;i<=1000;i++)//完成2的1000次方
        {
                for(k=0;k<1000;k++)//完成对一个数的*2
                {
                        array[k]=array[k]*2;
                     }
                     
                                for(l=0;l<=1000;l++)//检验从个位到所有可能要进1的位
                                {
                                    if(array[l]>=10) {
                                            array[l]=array[l]%10;
                                            ++array[l+1];
                                    }
                                }
        }
        for(i=0;i<1000;i++)
        {
                sum=array[i]+sum;
        }
      
        printf("2的1000次方的各位之和是:%d\n",sum);
      
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 14:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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