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日

悬赏问题

  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败