将小数用分数表示的c++代码函数,带注释
时间: 2023-05-20 18:03:19 浏览: 68
以下是将小数用分数表示的 C 代码函数,带注释:
```c
#include <stdio.h>
// 求最大公约数
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
// 将小数转化为分数
void decimalToFraction(double decimal) {
// 分子
int numerator = decimal * 1000000;
// 分母
int denominator = 1000000;
// 求最大公约数
int commonDivisor = gcd(numerator, denominator);
// 化简分数
numerator /= commonDivisor;
denominator /= commonDivisor;
// 输出结果
printf("%d/%d\n", numerator, denominator);
}
int main() {
double decimal = 3.1415926;
decimalToFraction(decimal);
return 0;
}
```
这个函数可以将小数转化为分数,例如将 3.1415926 转化为 31415926/10000000。
相关问题
如何保留两位小数c++
要保留两位小数c,可以使用以下方法:
1. 使用printf函数: 在代码中找到以下注释行 //printf("%.2f %.2f",sum,average); 将其取消注释,然后运行程序即可得到保留两位小数的结果。
2. 使用cout和setprecision函数: 在代码中找到以下注释行 //cout<<fixed<<setprecision(2);cout<<sum<<" "<<average; 将其取消注释,然后运行程序即可得到保留两位小数的结果。
3. 使用cout和setf函数: 在代码中找到以下注释行 //cout<<setiosflags(ios::fixed)<<setprecision(2)<<sum<<" "<<average; 将其取消注释,然后运行程序即可得到保留两位小数的结果。
无论选择哪种方法,都可以得到结果257.50和85.83。
c++写一段将五、八、十二、十六进制浮点数(也可能是小数,负数)转化成十进制浮点数的代码,整数部分和小数部分分开算,代码写在一个函数中,数字由用户输出,要有必要的容错率。并为代码注释,说明算法。
以下是将五、八、十二、十六进制浮点数转化成十进制浮点数的C++代码:
```c++
#include <iostream>
#include <cmath>
using namespace std;
// 将五、八、十二、十六进制浮点数转化成十进制浮点数
double hexToDec(string hex) {
int len = hex.length();
double result = 0.0;
int pointIndex = -1; // 记录小数点位置
int expIndex = -1; // 记录指数位置
int expSign = 1; // 记录指数符号
int expValue = 0; // 记录指数值
bool isNegative = false; // 是否为负数
// 判断是否为负数
if (hex[0] == '-') {
isNegative = true;
hex = hex.substr(1);
len--;
}
// 判断是否为科学计数法
for (int i = 0; i < len; i++) {
if (hex[i] == 'p' || hex[i] == 'P') {
expIndex = i;
break;
} else if (hex[i] == '.') {
pointIndex = i;
}
}
// 计算指数值
if (expIndex != -1) {
if (hex[expIndex + 1] == '-') {
expSign = -1;
expValue = stoi(hex.substr(expIndex + 2));
} else {
expValue = stoi(hex.substr(expIndex + 1));
}
}
// 计算整数部分
if (pointIndex == -1) { // 没有小数
for (int i = 0; i < len; i++) {
if (hex[i] >= '0' && hex[i] <= '9') {
result += (hex[i] - '0') * pow(16, len - i - 1);
} else if (hex[i] >= 'A' && hex[i] <= 'F') {
result += (hex[i] - 'A' + 10) * pow(16, len - i - 1);
} else if (hex[i] >= 'a' && hex[i] <= 'f') {
result += (hex[i] - 'a' + 10) * pow(16, len - i - 1);
}
}
} else { // 有小数
for (int i = 0; i < pointIndex; i++) {
if (hex[i] >= '0' && hex[i] <= '9') {
result += (hex[i] - '0') * pow(16, pointIndex - i - 1);
} else if (hex[i] >= 'A' && hex[i] <= 'F') {
result += (hex[i] - 'A' + 10) * pow(16, pointIndex - i - 1);
} else if (hex[i] >= 'a' && hex[i] <= 'f') {
result += (hex[i] - 'a' + 10) * pow(16, pointIndex - i - 1);
}
}
for (int i = pointIndex + 1; i < len; i++) {
if (hex[i] >= '0' && hex[i] <= '9') {
result += (hex[i] - '0') * pow(16, pointIndex - i);
} else if (hex[i] >= 'A' && hex[i] <= 'F') {
result += (hex[i] - 'A' + 10) * pow(16, pointIndex - i);
} else if (hex[i] >= 'a' && hex[i] <= 'f') {
result += (hex[i] - 'a' + 10) * pow(16, pointIndex - i);
}
}
}
// 计算指数部分
if (expIndex != -1) {
result *= pow(2, expValue * expSign);
}
// 判断是否为负数
if (isNegative) {
result = -result;
}
return result;
}
// 测试代码
int main() {
string hex1 = "0x3.14p3";
string hex2 = "-0x8.b7p1";
string hex3 = "0x1Cp0";
string hex4 = "-0x1F.2p-2";
double dec1 = hexToDec(hex1);
double dec2 = hexToDec(hex2);
double dec3 = hexToDec(hex3);
double dec4 = hexToDec(hex4);
cout << hex1 << " -> " << dec1 << endl;
cout << hex2 << " -> " << dec2 << endl;
cout << hex3 << " -> " << dec3 << endl;
cout << hex4 << " -> " << dec4 << endl;
return 0;
}
```
上述代码的算法思路如下:
1. 判断是否为负数,如果是,将负号去掉,并标记为负数。
2. 判断是否为科学计数法,如果是,记录指数位置,并计算指数值。
3. 根据小数点位置,将整数部分和小数部分分别计算。
4. 如果有指数部分,根据指数符号和指数值,计算出指数部分的值。
5. 如果原数为负数,将计算得到的结果取相反数。
对于计算十六进制数的整数部分和小数部分,可以根据每一位上的数字,乘以16的相应次方,然后相加得到结果。对于计算指数部分,可以根据指数符号和指数值,计算2的相应次方,然后将结果乘以整数部分和小数部分的值。