狛 枝 凪 斗 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 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题