【问题标题】:Obtaining quotient with remainder using just arithmetic operators仅使用算术运算符获得带余数的商
【发布时间】:2016-07-06 12:56:35
【问题描述】:

我刚刚开始学习 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;

}

【问题讨论】:

  • 您认为这样的操作的其余部分会保持什么相关性?
  • 您是在问如何通过9/5 * c + 32 获得浮点数?
  • @NathanOliver 是的,只使用算术运算符。
  • @IgnacioVazquez-Abrams 我相信是使用简单的算术运算符转换任何整数
  • 我认为您错过了我的问题的重点。 为什么温度转换的“剩余部分”对任何地方的任何人都有用?

标签: c++ math operators


【解决方案1】:
f = 9/5 * c + 32; //incorrect ways for obvious reason

如果你知道这是错误的“明显原因”,你就不会问这个问题了!

实际上是不正确的,因为它使用 整数 值进行计算。 95c32 都是 ints,当您使用 ints 进行数学运算时,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,是否仍然可以返回上述结果?
  • @teo 之类的。你可以做9/5 * static_cast&lt;double&gt;(c) + 32,但问题是9/5 == 1(不是1.8)。你对此无能为力。一个整数除以另一个整数总是得到一个整数结果。
【解决方案2】:

文字95 都具有int 类型,因此表达式9/5 也将产生int 类型的值。这意味着向零舍入,因此产生值1

本质上,要获得您期望的结果,您需要使用浮点数。

例如;

 f = 9.0/5.0*c + 32;

9.05.0 都是double 类型,因此除法产生double 类型的结果(等于1.8)。由于1.8double 类型,所以c 在进行乘法运算之前被提升为double。相乘的结果是double类型,所以32在相加之前也被提升为double

【讨论】:

  • 简单地说,为避免此类问题,我只需将任何数字声明为浮点数,因为我的公式包含一个返回浮点值的分数。
  • 但是例如,如果我的公式坚持为整数 9/5,是否仍然可以返回上述结果?
  • 公式不“坚持为整数 9/5”。如果您在编程语言中实现一个公式,您需要以一种按要求工作的方式来表达该公式。在 C++ 中,这意味着考虑到两个 int 类型的值相除、相加、相乘或相减会产生int,而不是double。如果您想要浮点结果,则需要将文字值表示为浮点数(例如 9.0 而不是 9)或者需要显式转换 int 类型的值(例如 static_cast&lt;double&gt;(9))。跨度>
【解决方案3】:

得到一个浮点数

9/5 * c + 32

那么除法的值之一需要是浮点字面量。这将导致除法的结果为浮点值,进而导致表达式的其余部分为浮点值。我们可以使用

f = 9.0/5 * c + 32;

添加.0 会导致文字变为double 而不是int

【讨论】:

  • 但是例如,如果我的公式坚持为整数 9/5,是否仍然可以返回上述结果?
【解决方案4】:

您的因子是整数,因此结果将是整数。

代替9/5 * c + 32 试试9.0/5.0 * c + 32

您可能还想将 c 声明为双精度数。

【讨论】:

    【解决方案5】:

    获得除法运算的商和余数不会帮助您计算摄氏度的华氏度,但通常可以这样计算商和余数:

    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 强制使用浮点数进行计算。

    【讨论】:

    • 我只是想通过算术运算符获得 9/5 的值,即 1.8,但它要么使用运算符“/”返回 1,要么使用运算符“%”返回 4
    • 因为您正在执行整数除法,正如您对问题的几乎每个答案中所述。小数 1.8 等于 分数 1 4/5(五分之一和四分之四),这就是商和余数共同的意思。如果要获得 1.8,则需要执行浮点除法,这是通过确保除法运算符的至少一个操作数是浮点类型(float、double 等)来完成的。所以,做9.0/5.0 会给你一个浮动结果。但是,如果您将该结果分配给 int 变量,您将失去浮点数,只剩下 1。
    • 但是例如,如果我的公式坚持为整数 9/5,是否仍然可以返回上述结果?
    • 如果你想要两个整数相除时的商和余数,% 将给出余数,/ 将给出商。你的问题的标题是获取这两个独立的值,那你为什么要问如何得到 1.8?
    • 不管怎样,既然9/51.8,你为什么不把公式写成1.8 * c + 32?这避免了您在理解这一点时似乎遇到的问题。
    猜你喜欢
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多