zoukankan      html  css  js  c++  java
  • hdu 1178 Heritage from father (推导)

    题意:

      有一个金币堆的金字塔,最上层就有一个金币,以后的i层都是边长为i的实心三角形,给你层数,问:一共有多少个金币?(用科学计数法表示,并且保留两位小数)

    解题思路:

      根据题意可知求出1*n+2*(n-1)+3*(n-2)+4*(n-3)+.......+(n-2)*3+(n-1)*2+n*1的和即可,但是要化简一下求出n*(n+1)*(n+2)/6;

    证明:

      1 * n + 2 (n - 1) + 3 (n - 2) + …… + (n - 2) * 3 + (n - 1) * 2 + n * 1

      = 1 * (n + 1 - 1) + 2 (n + 1 - 2) + 3 (n + 1 - 3) + …… + (n - 2) * (n + 1 - (n - 2)) + (n - 1) * (n + 1 - n - 1) + n * (n + 1 - n)

      =(1 + 2 + 3 + ... + n)(n + 1) - (1^2 + 2^2 + 3^2 + ..... + n^2)

      =n (n + 1)^2 / 2 - n (n + 1) (2n + 1) / 6       (n (n + 1) (2n + 1) / 6后面会证明)

      =n * (n + 1) * (n + 2) / 6          (证毕)

      (n+1)^3-n^3=3n^2+3n+1, 

      n^3-(n-1)^3=3(n-1)^2+3(n-1)+1 

      

      3^3-2^3=3*(2^2)+3*2+1 

      2^3-1^3=3*(1^2)+3*1+1.

      这n个等式两边分别相加得出:

      (n+1)^3-1=3(1^2+2^2+3^2+....+n^2)+3(1+2+3+...+n)+n, 

      (n+1)^3-1=3(1^2+2^2+3^2+....+n^2)+3((n+1)n/2)+n, 

      整理可得上述式子。

    代码:

     1 #include <stdio.h>
     2 int main ()
     3 {
     4     int n, i, k;
     5     double s;
     6 
     7     while (scanf ("%d", &n), n)
     8     {
     9         s = 1.0 * n * (n+1) * (n+2) / 6;
    10         k = 0;
    11         while (s >= 10)
    12         {
    13             s /= 10;
    14             k++;
    15         }
    16         printf ("%.2fE%d
    ", s, k);
    17     }
    18 
    19     return 0;
    20 }
    View Code
      
     
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    [转载]注解
    Spring可扩展的XML Schema机制 NamespaceHandlerSupport
    jvm中的年轻代 老年代 持久代 gc ----------转载
    反射原理
    舍入误差
    mysql突然宕机后事务如何处理?
    redis为什么设计成单线程并且还这么快?
    mysql架构学习
    用户级线程和内核级线程的区别
    G1垃圾收集器
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4103869.html
Copyright © 2011-2022 走看看