IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 1049 数列的片段和 (20 分)(C++) -> 正文阅读

[C++知识库]1049 数列的片段和 (20 分)(C++)

在这里插入图片描述

Notice:
1.一开始直接写嵌套循环,发现超时。所以需要用数学方法去求解。
	后参考别人博客,发现其规律:
	
	先观察一个数,例如,对于N=4的数列中序列号为3的数所在的片段如下:
	   (起点为1)[(1,2,3),(1,2,3,4)];
	   (起点为2)[(2,3),(2,3,4)];
	   (起点为3)[(3),(3,4)];
	可以看出来,包含第i个数的片段中,片段的起始可以是1,2,3..i,一共i种选择,
	(如包含3的片段有123三种选择) 片段的结尾可以是i,i+1,...n,一共n-i+1种选择。
	(如包含3的片段有34两种选择)。
	由此推广,对于长度为N的数列中序列号为i的数,所在的片段可分为i个部分,第i部分起点为i,
	终点分别为i,i+1,i+2,...,N,共(N-i+1)个,故序列i的出现次数为i*(N-i+1)。
	http://www.bubuko.com/infodetail-3010293.html
2.关于long long sum:

“N比较大时,double类型的值多次累加导致的精度误差,因为输入为十进制小数,存储到double中时,
计算机内部使用二进制表示,且计算机的字长有限,有的十进制浮点数使用二进制无法精确表示
只能无限接近,在字长的限制下不可避免会产生舍入误差,这些细微的误差在N较大时多次累加
会产生较大误差,所以建议不要使用double类型进行多次累加的精确计算,而是转为能够精确存储
的整型。尝试把输入的double类型的值扩大1000倍后转为long long整型累加,同时使用
long long类型保存sum的值,输出时除以1000.0转为浮点型再输出(相当于把小数点向后移动3位后
再计算,避免double类型的小数部分存储不精确,多次累加后对结果产生影响) 但我觉得乘以1000
也未必严谨,可能测试样例最小只有小数点后三位,如果测试样例变成小数点后四位、五位、六位,
乘以1000相当于直接在小数点后三位处截断,而原本第四五六位经过多次累加进位后依然可能会引起
精度问题,但如果乘以10000就会超出long long的值,我认为最精确的应该是截取到所有小数中最大
的位数的那一位。。可能我的想法有疏漏,经过测试,测试样例确实没有超过小数点后三位,
虽然修改为乘以1000后代码已经AC,但如果对测试样例稍加修改,可能又会导致不AC了…
所以这道题先打个问号吧,我猜可能将来题目样例还会被修改…”

我的 (该代码超时)

#include <iostream>
#include <cstdio>
using namespace std;
int main(){
    int n;
    cin >> n;
    float a[n];
    for(int i = 0;i < n;i++){
        cin >> a[i];
    }
    float sum1 = 0,sum2 = 0;
    for(int i = 0;i < n;i++){
            sum1 = 0;
        for(int j = i;j < n;j++){
            sum1 += a[j];
            sum2 += sum1;
        }
    }
    printf("%.2f",sum2);
    return 0;
}

柳诺的代码

#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    double temp;
    long long sum = 0;
    for(int i = 1;i <= n;i++){
        cin >> temp;
        sum += (long long)(temp * 1000) * i * (n - i + 1); 
    }
    printf("%.2f",sum / 1000.0);
    return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-18 15:47:14  更:2021-12-18 15:47:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:42:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码