鱼C论坛

 找回密码
 立即注册
查看: 742|回复: 10

[已解决]有人知道真正的算法吗?

[复制链接]
发表于 2020-8-10 00:49:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
谭浩强《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);
}

请教:有人知道,真正的还款公式吗?
最佳答案
2020-8-10 09:22:34
公式应该没问题,log函数里要大于0,p - d *  r要确保他大于0,不能乱输入啊
可以加个if判断,如果p - d * r 小于等于0, 退出程序或重新输入
log函数定义可以参考:https://blog.csdn.net/weixin_37609825/article/details/79850874
题用图.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-10 00:53:24 | 显示全部楼层
每月至少得还款 46640元,我想没有多少人能够买得起房,因此,我认定给出的计算公式不正确,至少是不完全正确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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),我化简到这一步,然后取对数,由于年代久远,取对数这一步,我真不记得该怎么做了,请帮我。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 08:00:16 | 显示全部楼层
公式我觉得应该是对的,虽然我也不是很确定,你错误的原因是因为log这个函数,log()表达式里的数字必须要大于0. 而 (6800- 800000*0.0583)明显小于0啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 08:00:48 | 显示全部楼层
结果就是每个月还得钱还不够利息得,永远还不清
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

所以呀,0和负数没有对数,就得加大每月还款的数额,每月得还46600多呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 09:22:34 | 显示全部楼层    本楼为最佳答案   
公式应该没问题,log函数里要大于0,p - d *  r要确保他大于0,不能乱输入啊
可以加个if判断,如果p - d * r 小于等于0, 退出程序或重新输入
log函数定义可以参考:https://blog.csdn.net/weixin_37609825/article/details/79850874
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 18:28:07 From FishC Mobile | 显示全部楼层
大哥   可能是我没看懂  你d*r求的是啥   算出来的是每月还款吗…
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-10 20:05:24 | 显示全部楼层
拖延症大叔 发表于 2020-8-10 18:28
大哥   可能是我没看懂  你d*r求的是啥   算出来的是每月还款吗…

你看懂了,d*r 实际上是每年的还款。这还得怪书中出题时,没有明确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的意见很好,按你的意见,我修改了程序,已经完美地解决了问题,见下帖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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);
}



习题截图.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 07:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表