存款利息的计算。有1000元,想存5年,可按以下5种办法存:
(1)一次存5年期
(2)先存2年期,到期后将本息再存3年期
(3)先存3年期,到期后将本息再存2年期
(4)存1年期,到期后将本息再存1年期,连续存5次
(5)存活期存款,活期利息每一季度结算一次
2017年银行存款利息如下:
1年期定期存款利息为1.5%;
2年期定期存款利息为2.1%;
3年期定期存款利息为2.75%;
5年期定期存款利息为3%;
活期存款利息为0.35%(活期存款每一季度结算一次利息)
#include<stdio.h>
#include<math.h>
int main()
{
float money = 1000, r1 = 0.015, r2 = 0.021, r3 = 0.0275, r5 = 0.03, r_h = 0.0035;
//1
float p1 = money * (1 + 5 * r5);// 一次存5年期
//2
float p2_1 = money * (1 + 2 * r2);// 先存2年期,到期后将本息再存3年期
float p2 = p2_1 * (1 + 3 * r3);
//3
float p3_1 = money * (1 + 3 * r3);// 先存3年期,到期后将本息再存2年期
float p3 = p3_1 * (1 + 2 * r2);
//4
float p4 = money * pow(1 + r1, 5);// 存1年期,到期后将本息存再存1年期,连续存5次
//5
float p5 = money * pow(1 + r_h / 4, 20);// 存活期存款。活期利息每一季度结算一次
printf("%f\n%f\n%f\n%f\n%f\n", p1,p2,p3,p4,p5);
return 0;
}
结果如下图:
补充说明
为了计算不同存款方式下的最终本息总额,我们需要根据每种存款方式的规则进行逐步计算。
首先,我们定义几个变量和函数来帮助我们进行计算:
P0: 初始存款金额,这里为1000元。
r_1, r_2, r_3, r_5, r_active: 分别为1年期、2年期、3年期、5年期和活期存款的年利率。
n_1, n_2, n_3, n_5, n_active: 分别为1年期、2年期、3年期、5年期和活期存款的年数或季度数(对于活期存款)。
由于活期存款利息每一季度结算一次,我们需要将年利率转换为季度利率,并将年数转换为季度数。
接下来,我们按照每种存款方式进行计算:
(1)一次存5年期
本息总额 = P0 × (1 + r_5)^5
(2)先存2年期,到期后将本息再存3年期
本息总额 = P0 × (1 + r_2)2 × (1 + r_3)3
(3)先存3年期,到期后将本息再存2年期
本息总额 = P0 × (1 + r_3)3 × (1 + r_2)2
(4)存1年期,到期后将本息再存1年期,连续存5次
本息总额 = P0 × (1 + r_1)^5
(5)存活期存款,活期利息每一季度结算一次
季度利率 = r_active / 4
季度数 = 5 × 4 = 20(因为一年有4个季度)
本息总额 = P0 × (1 + 季度利率)^20
现在我们可以开始计算每种存款方式下的本息总额。
原代码中,有几个地方的计算公式需要调整以符合复利计算的原理。复利计算中,本金和利息会在每个存款周期结束时相加,并作为下一个周期的本金。下面是修正后的代码:
#include<stdio.h>
#include<math.h>
int main()
{
float money = 1000, r1 = 0.015, r2 = 0.021, r3 = 0.0275, r5 = 0.03, r_h = 0.0035;
// 1
float p1 = money * pow(1 + r5, 5); // 一次存5年期,复利计算
// 2
float p2_1 = money * pow(1 + r2, 2); // 先存2年期
float p2 = p2_1 * pow(1 + r3, 3); // 到期后将本息再存3年期
// 3
float p3_1 = money * pow(1 + r3, 3); // 先存3年期
float p3 = p3_1 * pow(1 + r2, 2); // 到期后将本息再存2年期
// 4
float p4 = money * pow(1 + r1, 5); // 存1年期,到期后将本息存再存1年期,连续存5次
// 5
float r_h_quarter = r_h / 4; // 季度利率
float p5 = money * pow(1 + r_h_quarter, 5 * 4); // 存活期存款,每季度结算一次,共20个季度
printf("%f\n%f\n%f\n%f\n%f\n", p1, p2, p3, p4, p5);
return 0;
}
现在,每个存款方式的计算都使用了pow函数来应用复利公式。对于活期存款,由于每季度结算一次利息,所以总季度数为5 * 4 = 20。
请注意,这里假设所有的利率都是年化利率,并且是在每个存款周期结束时结算的。如果实际情况有所不同(例如,某些银行可能在存款周期开始时结算利息),则需要相应地调整计算公式。
C和C++区别
C语言和C++是两种不同的编程语言,尽管C++在设计和实现上受到了C语言的强烈影响,但两者之间存在一些显著的区别。以下是C语言和C++之间的一些主要不同点:
面向对象编程(OOP):
C++是一种面向对象的编程语言,它支持类、对象、继承、多态等OOP概念。
C语言是一种面向过程的编程语言,不支持OOP特性。
内存管理:
C++引入了析构函数、RAII(资源获取即初始化)等概念,使得内存管理更加安全。
C语言中的内存管理需要程序员手动进行,包括使用malloc、calloc、realloc和free等函数。
函数重载:
C++支持函数重载,即可以使用相同的函数名但参数列表不同的函数。
C语言不支持函数重载。
引用和指针:
C++引入了引用的概念,引用是变量的别名,可以看作是对变量的一个常量指针。
C语言只有指针的概念,没有引用。
异常处理:
C++提供了try/catch/throw异常处理机制,使得错误处理更加灵活和方便。
C语言没有内置的异常处理机制,通常使用错误码或全局变量进行错误处理。
模板和泛型:
C++支持模板和泛型编程,使得可以编写可重用的代码。
C语言不支持模板和泛型。
标准库:
C++的标准库比C语言的更加丰富和强大,包括STL(Standard Template Library)等。
C语言的标准库相对简单,但提供了基本的输入输出、字符串处理、内存管理等功能。
运算符重载:
C++允许程序员重载大部分运算符,以便对自定义类型进行类似内置类型的操作。
C语言不支持运算符重载。
命名空间(Namespace):
C++引入了命名空间的概念,用于解决命名冲突问题。
C语言没有命名空间的概念。
初始化列表:
C++中的类构造函数可以使用初始化列表来初始化成员变量。
C语言没有类,因此没有初始化列表的概念。
编译时检查:
C++在编译时会进行更严格的类型检查,有助于减少运行时错误。
C语言的类型检查相对宽松,有时可能导致运行时错误。
请注意,虽然C++在功能和安全性方面相对于C语言有所改进,但由于C++的复杂性,它也可能导致一些新的问题,如编译时间增加、代码难以维护等。因此,在选择使用哪种语言时,需要根据具体的应用场景和需求进行权衡。
C++实现
在C++中实现上述C语言代码几乎是一样的,因为C++兼容C语言的语法。但是,为了符合C++的编程风格,我们可以稍微修改一下代码,例如使用#include 代替#include <stdio.h>,并使用C++风格的I/O流。下面是C++版本的代码:
#include <iostream>
#include <cmath> // 使用cmath而不是math.h,因为cmath是C++标准库中的
int main() {
float money = 1000, r1 = 0.015f, r2 = 0.021f, r3 = 0.0275f, r5 = 0.03f, r_h = 0.0035f;
// 1
float p1 = money * std::pow(1 + r5, 5); // 一次存5年期,复利计算
// 2
float p2_1 = money * std::pow(1 + r2, 2); // 先存2年期
float p2 = p2_1 * std::pow(1 + r3, 3); // 到期后将本息再存3年期
// 3
float p3_1 = money * std::pow(1 + r3, 3); // 先存3年期
float p3 = p3_1 * std::pow(1 + r2, 2); // 到期后将本息再存2年期
// 4
float p4 = money * std::pow(1 + r1, 5); // 存1年期,到期后将本息存再存1年期,连续存5次
// 5
float r_h_quarter = r_h / 4; // 季度利率
float p5 = money * std::pow(1 + r_h_quarter, 5 * 4); // 存活期存款,每季度结算一次,共20个季度
// 使用C++风格的I/O流输出
std::cout << std::fixed << std::setprecision(2); // 设置输出的小数点后保留位数
std::cout << p1 << std::endl;
std::cout << p2 << std::endl;
std::cout << p3 << std::endl;
std::cout << p4 << std::endl;
std::cout << p5 << std::endl;
return 0;
}
注意几点:
使用了#include 和#include ,这是C++标准库中的头文件。
使用了std::pow而不是pow,因为pow函数在cmath库中,并且需要std::前缀来指明它属于std命名空间。
添加了std::cout << std::fixed << std::setprecision(2);来设置输出的小数点后保留位数,这样输出会更加整齐。
使用了C++风格的I/O流(std::cout)来替代C风格的printf。