仅使用算术运算符获得余数的商
Obtaining quotient with remainder using just arithmetic operators
我刚刚开始学习一些C++的基础知识,但我偶然发现了一个问题。
例如,我正在尝试将摄氏度转换为华氏度。
假设,我只有这个固定公式。
F = 9/5(c) + 32
我知道在数学上可以将其分解为
Mathematically : (9c/5) + 32
但是,我将无法通过提醒获得商
那么我究竟如何仅使用算术运算符通过提醒获得两个商,还是不可能
我测试过,但它仍然拒绝给我正确的输出
#include<iostream>
using namespace std;
int main(){
double f;
int c;
cout<<"Enter degree celcius:"<<endl;
cin>>c;
cout<<endl;
f = 9/5 * c + 32; //incorrect ways for obvious reason
f = 9%5 * c + 32; //incorrect ways for obvious reason
cout<<c<<"degree celcius is equals to:"<<f<<endl;
}
f = 9/5 * c + 32; //incorrect ways for obvious reason
如果你知道为什么这是不正确的"明显原因",你就不会问这个问题了!
它实际上是不正确的,因为它使用整数值进行计算。 9
、5
、c
和32
都是int
s,当你用int
s进行数学运算时,C++给你的结果是一个int
。由于整数是整数,因此它们没有小数部分,并且不能存储余数。
计算完成后,将结果分配给 f
,这是一个double
。尽管浮点类型具有可以存储余数的小数部分,但您在此处所做的只是将整数结果转换为浮点值。
您可以将代码视为等效于:
int result = 9/5 * c + 32;
f = static_cast<double>(result);
为了解决这个问题,你需要强制计算作为浮点数完成:
f = 9.0/5.0 * static_cast<double>(c) + 32.0;
这将保留"余数"作为浮点值的小数部分,f
。
从技术上讲,您只需要单个中间操作即可生成浮点结果。如果第一个操作产生浮点值,则所有剩余的操作数都将提升为浮点数以匹配此初始操作数。因此,您可以简单地执行以下操作:
f = 9.0/5 * c + 32;
(9.0
是双精度文本,就像9
是整数文本一样。添加小数部分(.x
)是把它变成双精度的原因。如果你写了9.0f
,那将是一个浮动文字。
>文字9
和5
都有类型int
,所以表达式9/5
也会产生一个类型为int
的值。 这意味着四舍五入到零,因此产生值1
。
本质上,要获得预期的结果,您需要使用浮点数。
例如;
f = 9.0/5.0*c + 32;
9.0
和 5.0
都是 double
型,所以除法产生类型 double
的结果(等于 1.8
)。 由于1.8
是double
型,c
在做乘法之前被提升为double
。 乘法的结果是类型 double
,所以32
在相加之前也会提升为 double
。
获取浮点数
9/5 * c + 32
然后,除法的一个值需要是一个浮点文字。 这将导致除法的结果为浮点值,进而使表达式的其余部分成为浮点值。 我们可以通过使用
f = 9.0/5 * c + 32;
添加.0
会导致文本成为double
,而不是int
。
您的因子是整数,因此结果将是整数。
与其9/5 * c + 32
不如尝试9.0/5.0 * c + 32
您可能还想将 c 声明为双精度。
获取除法运算的商和余数不会帮助您计算摄氏度的华氏当量,但通常商和余数可以这样计算:
int dividend = 123;
int divisor = 5;
int quotient = dividend / divisor; // integer division
int remainder = dividend % divisor; // use modulo operation to get remainder
cout << "quotient = " << quotient << ", remainer = " << remainder << endl;
# quotient = 24, remainer = 3
要获得华氏度作为双精度:
double fahrenheit = 9/5.0 * c + 32; // uses floating point division
使用 5.0
强制使用浮点进行计算。
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 余数运算符的等效操作,用于处理低于允许的最小值
- 在标准(C++11)中,有人说余数运算符只适用于积分类型
- 仅使用算术运算符获得余数的商
- 如何在size_t上用余数运算符得到负余数