zoukankan      html  css  js  c++  java
  • HDOJ(1001) Sum Problem

    这一套题做错了几次,按理说直接用等差数列求和公式就行了,主要是要考虑一些运算符的结核性问题:

    四则运算符(+、-、*、/)和求余运算符(%)结合性都是从左到右。

    于是,我自己写了一个版本,主要是考虑(n+1)*n始终为偶数,这样就不用担心除以2时的取整问题:

     1 #include <stdio.h>
     2 
     3 int main(void)
     4 {
     5     int n;
     6     __int64 sum = 0;
     7 
     8     while (scanf("%d", &n) != EOF)
     9     {
    10         sum = ((n + 1) * n) / 2;
    11         printf("%I64d
    ", sum);
    12         printf("
    ");
    13     }
    14 
    15     return 0;
    16 }

    但是,这个版本并不能通过,还有一种可能就是(n+1)*n导致数据溢出了,于是搜索了一下,发现有人给出了一个通过了的代码,如下:

     1 #include <stdio.h>
     2 
     3 int main(void)
     4 {
     5     int n;
     6     __int64 sum = 0;
     7 
     8     while (scanf("%d", &n) != EOF)
     9     {
    10         sum = (n % 2) == 0 ? ((1 + n) * (n / 2)) : ((1 + n) * (n / 2) + n / 2 + 1);
    11         printf("%I64d
    ", sum);
    12         printf("
    ");
    13     }
    14 
    15     return 0;
    16 }

     如果n为奇数,则使用(1+n)*(n/2)就会漏掉序列最中间的项,所以要最后再加上中间项n/2+1。

    为了验证是防止溢出问题,我于是写了另外一个版本,结果通过了,代码如下:

     1 #include <stdio.h>
     2 
     3 int main(void)
     4 {
     5     int i, n;
     6     int sum = 0;
     7 
     8     while (scanf("%d", &n) != EOF)
     9     {
    10         sum = 0, i = 1;
    11 
    12         while (i <= n){
    13             sum += i;
    14             ++i;
    15         }
    16         printf("%I64d
    ", sum);
    17         printf("
    ");
    18     }
    19 
    20     return 0;
    21 }
  • 相关阅读:
    晶振及COMS电路
    笔记16 C# typeof() & GetType()
    笔记15 修饰符
    笔记14 数据库编程技术
    C#基础知识
    C#连接数据库
    笔记13 winform
    笔记12 export to excel (NPOI)
    笔记11 export to excel
    笔记10
  • 原文地址:https://www.cnblogs.com/xiaomanon/p/4459272.html
Copyright © 2011-2022 走看看