m0_74038364 2023-03-15 16:13 采纳率: 66.7%
浏览 44
已结题

1+2+...+n结果为负数,longlong型也没用,不知道哪里错了。

题目实验题1:求1~n的连续整数和
目的:通过对比同一问题不同解法的绝对执行时间,体会不同算法的优劣。
内容:编写一个程序exp1-1.cpp,对于给定的正整数n,求1+2+…+n,采用逐个累加和n(n+1)/2(高斯法)两种解法。对于相同的n,给出这两种解法的求和结果和求解时间,并用相关数据进行测试。

代码:

#include<stdio.h>
#include<time.h>
#include<math.h>

long add1(long long n)
{
    long long i,sum=0;
    for(i=1;i<=n;i++)
       sum+=i;
    return sum;
} 

void AddTime1(long long n)
{
    clock_t t;
    long long sum;
    t=clock();
    sum=add1(n);
    t=clock()-t;
    printf("方法1:\n");
    printf("结果:%lld\n",sum);
    printf("用时:%lf\n",((float)t)/CLOCKS_PER_SEC);
}

long add2(long long n)
{
    return n*(n+1)/2;
}

void AddTime2(long long n)
{
    clock_t t;
    long long sum;
    t=clock();
    sum=add2(n);
    t=clock()-t;
    printf("方法2:\n");
    printf("结果:%lld\n",sum);
    printf("用时:%lf\n",((float)t)/CLOCKS_PER_SEC);
}

int main()
{
    int n;
    printf("n(大于1000000):");
    scanf("%d",&n);
    if(n<1000000)
       return 0;
    AddTime1(n);
    AddTime2(n);
    return 1; 
} 

结果问题:
当n为99999999(8个9),结果为正数;当n为77777777(8个7),结果为负数。按理说,从1加到n,99999999比77777777大,后者怎么会是负数呢?

如图所示:

img

img

  • 写回答

1条回答 默认 最新

  • 快乐鹦鹉 2023-03-15 16:19
    关注

    long add1(long long n),这返回值也得用long long 啊

    
    #include<stdio.h>
    #include<time.h>
    #include<math.h>
    #include <stdlib.h>
     
    long long add1(long long n)
    {
        long long i,sum=0;
        for(i=1;i<=n;i++)
           sum+=i;
        return sum;
    } 
     
    void AddTime1(long long n)
    {
        clock_t t;
        long long sum;
        t=clock();
        sum=add1(n);
        t=clock()-t;
        printf("方法1:\n");
        printf("结果:%lld\n",sum);
        printf("用时:%lf\n",((float)t)/CLOCKS_PER_SEC);
    }
     
    long long add2(long long n)
    {
        return n*(n+1)/2;
    }
     
    void AddTime2(long long n)
    {
        clock_t t;
        long long sum;
        t=clock();
        sum=add2(n);
        t=clock()-t;
        printf("方法2:\n");
        printf("结果:%lld\n",sum);
        printf("用时:%lf\n",((float)t)/CLOCKS_PER_SEC);
    }
     
    int main()
    {
        int n;
        printf("n(大于1000000):");
        scanf("%d",&n);
        if(n<1000000)
           return 0;
        AddTime1(n);
        AddTime2(n);
        system("pause");
        return 1; 
    } 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月23日
  • 已采纳回答 3月15日
  • 修改了问题 3月15日
  • 创建了问题 3月15日

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题