狛 枝 凪 斗 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 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行