zoukankan      html  css  js  c++  java
  • 杭电acm 1001题,sum problem 总结网上的各种方法和注意事项,及其该题的注意事项!

    Problem Description

    In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n.
     
    Input
    The input will consist of a series of integers n, one integer per line
     
    Output
    For each case, output SUM(n) in one line, followed by a blank line. You may assume the result will be in the range of 32-bit signed integer.
     
    Sample Input
    1 100
    Sample Output
    1 5050
     
    -------------------------------------------------------------------------------------------------------------------------------
     题意:
      输入一个数字,输出从1到该数字所有数字的和。
     
    该题的注意事项:避免变量的溢出。所以在所有acm中尽量减小数的位数。(注意:对于产生的小数,注意小数陷阱。因为有些小数不能精确表示。这里不赘述)。
     
    避免方法1:(暴力破解法)
          略。
          解析:该方法直接避免了数据溢出,不做解说。但是,作为acm的解法,则失去了算法的趣味。算法,应该更加依赖数学表达式,思维等等,而不是语法。
    避免方法2:
          这是我的代码:
    #include <stdio.h>
    int main(){
     int n;
     scanf("%d", &n);
     if (n % 2 == 0){
      printf("%d", (n / 2)*(n + 1));
     }
     else{
      printf("%d", (n + 1) / 2 * n);
     }
    }
    解析:该题目没有多大难度。但是存在运算过程中想不到的溢出。而结果也不存在溢出的情况。但是在过程中存在溢出的情况。从而造成结果的偏差。在过程中n*(n+1)会出现溢出。为了避免溢出。我做了上面的工作——除2。这样就可以解决了。
    对该方法的优化:
    #include<stdio.h>
    int main()
    {
    int n,sum;
    while(scanf("%d",&n)!=EOF)
    {
    sum=n/2.0*(n+1);
    printf("%d ",sum);
    }
    return 0;
    }
    注意:这个优化方法简化了不用判断n是否为偶数或者奇数。但是存在一个问题。这种优化的方法,应用比较狭隘(浮点运算陷阱)。奇数产生了0.5在浮点型中能精确表示。
    总结:注意在整个编程中确保每一个数是否出现溢出。
     
    该内容是总结网上博客的结果的前提下添加了自己的观点。
    欢迎大神吐槽。
  • 相关阅读:
    结巴分词 0.14 版发布,Python 中文分词库
    Lazarus 1.0.2 发布,Pascal 集成开发环境
    Android全屏 去除标题栏和状态栏
    服务器日志现 Android 4.2 传将添多项新特性
    Percona XtraBackup 2.0.3 发布
    长平狐 Android 强制设置横屏或竖屏 设置全屏
    NetBeans 7.3 Beta 发布,全新的 HTML5 支持
    CppDepend现在已经支持Linux
    GromJS 1.7.18 发布,服务器端的 JavaScript
    Apache OpenWebBeans 1.1.6 发布
  • 原文地址:https://www.cnblogs.com/damaoranran/p/8423810.html
Copyright © 2011-2022 走看看