zoukankan      html  css  js  c++  java
  • 杭电1178

    题意:第i层的硬币有i*(i+1)/2个,问总共有n(n<=2^31-1)层的总共有多少硬币,要求用科学计数法保留3位有效数字。

    Analyse:
    给出了第i层的金币数i*(i+1)/2,求的是n层的总金币数,
    n^3=(n-1)^3+3*(n-1)^2+3*(n-1)+1
    (n-1)^3=(n-2)^3+3*(n-2)^2+3*(n-2)+1
    (n-2)^3=(n-3)^3+3*(n-3)^2+3*(n-3)+1
    ……
    ……
    3^3=2^3+3*2^2+3*2+1
    2^3=1^3+3*1^2+3*1+1
    累加整理得sum=( (n+2)^3-(3*n^2+10*n+8) )/6。
    但是数据最大有2^31-1,用int,__int64都不够大,幸好题目只要求用科学记数法保留三位有效数字。也正好,double就是这样的数据类型,能表示数字的范围很大,数量级有10的几百次方,只不过精度低。要注意的是在原来的代码中, 内循环的判断语句是(int)sum/10,这样是错的,临时数据转换后int就溢出了,sum大到一定程度就过不了,所以要坚持double这个数据类型。
    View Code
     1 #include<stdio.h>
    2 main()
    3 {
    4 double n,sum;
    5 int digit;
    6 while(scanf("%lf",&n)&&n)
    7 {
    8 sum=( (n+2)*(n+2)*(n+2)-(3*n*n+10*n+8) )/6;
    9 digit=0;
    10 while( sum/10>=1 )
    11 {
    12 digit++;
    13 sum/=10;
    14 }
    15 printf("%.2lfE%d\n",sum,digit);
    16 }
    17 }
     
  • 相关阅读:
    BZOJ 3991 set维护dfs序
    BZOJ 4547 矩阵快速幂
    WERTYU | TEX Quotes
    高精度运算
    最大公约数和最小公倍数
    老鼠的旅行
    数据交换
    1136 A Delayed Palindrome
    1137 Final Grading
    1138 Postorder Traversal
  • 原文地址:https://www.cnblogs.com/ZShogg/p/2409738.html
Copyright © 2011-2022 走看看