风过无痕1989 发表于 2020-8-10 00:49:16

有人知道真正的算法吗?

谭浩强《C语言程序设计》(第四版)第三章的习题,原题是:购房贷款:300000,每月还款:6000,银行的利率是:1%,问多少个月还完。并提示给出公式:m = (log(p) - log(p - d * r)) / log(1 + r);对原题编写程序执行没有问题,68.7个月还完。我稍加改动就出问题了,程序如下:

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


int main()

{
        int d,p;                      // d为贷款数额,p为每月还款数额
        float m,r;                  // r为银行贷款利率
        printf("请输入贷款数额:");
        scanf("%d",&d);
        getchar();
        printf("请输入准备每月还款额度:");
        scanf("%d",&p);
        getchar();
        printf("请输入当前银行的贷款利率:");
        scanf("%f",&r);
        getchar();
        m = (log(p) - log(p - d * r)) / log(1 + r);
/*        printf("按上面的公式,每月至少得还款:");
        printf("%f\n",d * r);
*/
      printf("贷款%d元,每月还款%d,需要%.1f个月还完\n",d,p,m);
}

请教:有人知道,真正的还款公式吗?

风过无痕1989 发表于 2020-8-10 00:53:24

每月至少得还款 46640元,我想没有多少人能够买得起房,因此,我认定给出的计算公式不正确,至少是不完全正确

风过无痕1989 发表于 2020-8-10 07:43:21

本帖最后由 风过无痕1989 于 2020-8-10 08:13 编辑

风过无痕1989 发表于 2020-8-10 00:53
每月至少得还款 46640元,我想没有多少人能够买得起房,因此,我认定给出的计算公式不正确,至少是不完全正 ...

下面的等额还款公式,对吗?

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


int main()

{
        int d,p;                                     // d为贷款数额,p为每月还款数额
        float m,r;                                  // r为银行贷款利率
        printf("请输入贷款数额:");
        scanf("%d",&d);
        getchar();
        printf("请输入准备每月还款额度:");
        scanf("%d",&p);
        getchar();
        printf("请输入当前银行的贷款利率:");
        scanf("%f",&r);
        getchar();
        m = d / (p - d * r / 12);          // 等额本金的算法

    printf("贷款%d元,每月还款%d,需要%.1f个月还完\n",d,p,m);
}

       这是在网上搜的公式,等额本金还款,按百度百科的说法:等额本金还款法在贷款初期月还款额大,此后逐月递减(月递减额=月还本金×月利率)。不管采取哪种贷款还款方式,银行都没有做吃亏的买卖、客户也不存在节省利息支出的实惠。原计算公式是:m = d / (p - (d - s) * r / 12); s为已还款累计,12是将年利息转为月利息。

       按这个计算公式:贷款80万,每月还6800元,需要274.6个月还完。

       等额本息的公式:(1 + r / 12) ^ m =12 * p / ((12 * p) - d * r),我化简到这一步,然后取对数,由于年代久远,取对数这一步,我真不记得该怎么做了,请帮我。

Justin1 发表于 2020-8-10 08:00:16

公式我觉得应该是对的,虽然我也不是很确定,你错误的原因是因为log这个函数,log()表达式里的数字必须要大于0. 而 (6800- 800000*0.0583)明显小于0啊{:10_257:}

Justin1 发表于 2020-8-10 08:00:48

结果就是每个月还得钱还不够利息得,永远还不清

风过无痕1989 发表于 2020-8-10 08:15:14

Justin1 发表于 2020-8-10 08:00
公式我觉得应该是对的,虽然我也不是很确定,你错误的原因是因为log这个函数,log()表达式里的数字必须要 ...

所以呀,0和负数没有对数,就得加大每月还款的数额,每月得还46600多呀

巴巴鲁 发表于 2020-8-10 09:22:34

公式应该没问题,log函数里要大于0,p - d *r要确保他大于0,不能乱输入啊{:10_277:}
可以加个if判断,如果p - d * r 小于等于0, 退出程序或重新输入
log函数定义可以参考:https://blog.csdn.net/weixin_37609825/article/details/79850874

拖延症大叔 发表于 2020-8-10 18:28:07

大哥   可能是我没看懂你d*r求的是啥   算出来的是每月还款吗…

风过无痕1989 发表于 2020-8-10 20:05:24

拖延症大叔 发表于 2020-8-10 18:28
大哥   可能是我没看懂你d*r求的是啥   算出来的是每月还款吗…

你看懂了,d*r 实际上是每年的还款。这还得怪书中出题时,没有明确

风过无痕1989 发表于 2020-8-10 20:06:38

巴巴鲁 发表于 2020-8-10 09:22
公式应该没问题,log函数里要大于0,p - d *r要确保他大于0,不能乱输入啊
可以加个if判断, ...

你的意见很好,按你的意见,我修改了程序,已经完美地解决了问题,见下帖

风过无痕1989 发表于 2020-8-10 20:10:14

本帖最后由 风过无痕1989 于 2020-8-10 20:17 编辑

// 房贷问题,题目出自于谭浩强《C语言程序设计》第四版第三章习题
#include <stdio.h>
#include <math.h>


int main()

{
        int d,n,p;                                              // d为贷款数额,p为每月还款数额
        float m1,m2,r;                                          // r为银行贷款年利率
        printf("请输入贷款数额:");
        scanf("%d",&d);
        getchar();
        printf("请输入当前银行的贷款利率:");
        scanf("%f",&r);
        getchar();
        printf("请输入准备每月还款额度:");
L:      scanf("%d",&p);
        getchar();
        n = p - d * r / 12;
        if(n <= 0)
        {
                p = d * r / 12;
                printf("你需要提高每月的还款数额,至少每月得还款%d元",p);
                goto L;
        }
      m1 = (log(p) - log(p - d * r / 12)) / log(1 + r / 12);    // 等额本息的算法
        m2 = d / (p - d * r / 12);                              // 等额本金的算法
      printf("贷款%d元,每月等额本息还款%d,需要%.1f个月还完\n",d,p,m1);
        printf("贷款%d元,每月等额本金还款%d,需要%.1f个月还完\n",d,p,m2);
}



页: [1]
查看完整版本: 有人知道真正的算法吗?