狛 枝 凪 斗 2021-07-30 22:22 采纳率: 80%
浏览 15
已结题

HDU2156 分数矩阵 请问我的代码错在哪里?

描述
我们定义如下矩阵:
1/1 1/2 1/3
1/2 1/1 1/2
1/3 1/2 1/1
矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增。
请求出这个矩阵的总和。
输入
输入包含多组测试数据。每行给定整数N(N<50000),表示矩阵为N*N。当N=0时,输入结束。
输出
输出答案,结果保留2位小数。
样例输入
1
2
3
4
0
样例输出
1.00
3.00
5.67
8.83

以下是我的代码:

#include<iostream>
#include<cstdio>
#define printf __mingw_printf//加了这个是因为我的编译器long double会出错

using namespace std;

struct ftraction{
    long long up,down;
};

int main(){
    int n;
    while(scanf("%d",&n)!=EOF&&n!=0){
        int i;
        struct ftraction sum={0,1};
        for(i=n;i>0;i--){
            if(i==n){
               sum.up+=n;
            }else{
                struct ftraction temp={i*2,n-i+1};
                sum.up=sum.up*temp.down+temp.up*sum.down;
                sum.down*=temp.down;
            }
        }

        printf("%.2Lf\n",(long double)sum.up/(long double)sum.down);
    }
    return 0;
}


过问题给的样例是可以的,但是我发现当我输入的n逐渐变大之后,输出就会出错(从n=19开始变成了负数)。请问我的错误之处在哪里?

  • 写回答

1条回答 默认 最新

  • 快乐鹦鹉 2021-07-30 23:14
    关注
    sum.up=sum.up*temp.down+temp.up*sum.down;
    这行在连续相乘的情况下会溢出,修改很简单啊,把
    struct ftraction{
        long long up,down;
    }
    改成
    struct ftraction{
        long double up,down;
    }
    就好了啊,为啥非得用long long
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

    报告相同问题?

    问题事件

    • 系统已结题 8月7日
    • 已采纳回答 7月30日
    • 创建了问题 7月30日

    悬赏问题

    • ¥15 Google Chrome 所有页面崩溃,三种解决方案都没有解决,我崩溃了
    • ¥20 使用uni-app发起网络请求,获取重定向302返回的cookie
    • ¥20 手机外部浏览器拉起微信小程序支付 (相关搜索:微信小程序)
    • ¥20 怎样通过一个网址找到其他同样模版的网址
    • ¥30 XIAO esp32c3 读取FDC2214的数据
    • ¥15 在工控机(Ubuntu系统)上外接USB蓝牙硬件进行蓝牙通信
    • ¥15 关于PROCEDURE和FUNCTION的问题
    • ¥100 webapi的部署(标签-服务器)
    • ¥20 怎么加快手机软件内部计时的时间(关键词-日期时间)
    • ¥15 C语言除0问题的检测方法