zoukankan      html  css  js  c++  java
  • 算法题牛刀小试——序列求和

    题目

    求1+2+3+...+n的值。

    数据规模与约定

    1 <= n <= 1,000,000,000。

    正确答案

    #include <iostream>
    using namespace std;
    
    int main() {
    	long long n = 0;
    	scanf("%d",&n);
    	if(n>=1 && n<= 1000000000){
    		unsigned long long s = (n*(1+n))/2;
    		printf("%llu",s);
    	}
    	return 0;
    }
    

    这么简单的题我居然试了半天,自己的语言基础还是太差了,python这种脚本语言还是要少用。

    反思和易错点

    1.在MSVC和MinGW64位环境下,long类型都是4字节,我在mac64位上,long类型是8字节。

    2.printf中的标识符,long用%ld,long long用%lld,unsigned long long用%llu。

    3.最大的问题来了:
    一开始我以为只要存储结果的类型范围够大就行了,所以n一直用的int类型,发现一直越界,经过不断的debug发现,sizeof((n*(1+n))/2)为4字节,什么意思呢?就是说这个表达式最终结果是用4个字节存储的,那么一定会产生数值超出范围的情况。
    具体运算过程是这样的,右值先开辟一个int类型的内存进行运算,由于运算过程中没有一个数值存储大小大于int,所以不会自动进行转型,所有的运算都在int类型的范围内进行运算,解决方法就是n改为long long,或者运算的时候把表达式中随便一个n强制转为long long即可。

  • 相关阅读:
    第六章 装饰模式
    第二章 策略模式
    第一章 简单工厂模式
    HTTPS-post请求
    import&export
    Flask(Jinja2) 服务端模板注入漏洞vulhub
    MySQL UDF提权 过程及注意事项
    centos7 安装jdk1.8.0_271 以及错误解决
    WEB、FTP服务器所有响应码解释(超详细)
    Wolf CMS后台文件上传getshell并提权
  • 原文地址:https://www.cnblogs.com/trytoreachpeak/p/13290099.html
Copyright © 2011-2022 走看看