【问题描述】
从标准输入中输入一个小数,编写程序将其转换成相应的分数显示,即转换为几又几分之几。
要求:
1、输入的小数包括整数部分、小数点和小数部分;整数部分和小数部分分别最多有7位数字;整数部分可以为0,若整数部分为非零整数时,则其最高位不为0;小数部分的末尾数字不为零。
2、输出的分数应为最简分数,由三部分数字组成:第一部分数字代表整数部分(若分数小于1,则为0,否则输出相应分数的整数部分,且最高位不为0),第二部分数字代表分子,第三部分数字代表分母,分子比分母小且不能再约分。
3、自定义约分函数
【输入形式】
从标准输入中输入一个小数后打回车。
【输出形式】
将转换后相应分数的三个部分数值输出到标准输出,并且分别以一个空格分隔,最后一个数值后没有空格,有回车换行。
【样例1输入】
0.35
【样例1输出】
0 7 20
【样例2输入】
1050.0144
【样例2输出】
1050 9 625
【样例说明】
样例1中输入的小数为0.35,相应分数整数部分为0,小数部分转换为分数为35/100,约分成最简分数为7/20。
样例2中输入的小数为1050.0144,相应分数整数部分为1050,小数部分转换为分数为144/10000,约分成最简分数为9/625。
#include <stdlib.h>
#include <stdio.h>
// 判断两个整数的最大公约数是否为1
int is_prime(int a, int b)
{
while (a != b)
{
a>b?(a-=b):(b-=a);
}
return b;
}
int main(void)
{
char ch[20];
int a=0, b=1;
int i = 0, flag=0,temp, it = 0;
gets(ch);
// 读取尾数长度
while (ch[i])
{
if (flag == 1)
{
a += (ch[i]-'0');
a *= 10;
b *= 10;
}
else if(flag == 0 && ch[i] != '.')
it = it * 10 + (ch[i] - '0');
if (flag==0 && ch[i]=='.')
flag = 1;
i++;
}
a /= 10;
temp = is_prime(a,b);
while (1 != temp)
{
a /= temp;
b /= temp;
temp = is_prime(a,b);
}
printf("%d %d %d\n",it,a,b);
return 0;
}
该回答引用ChatGPT
参考下面代码
#include <stdio.h>
// 自定义函数,用于求分子分母的最大公约数并进行约分
void simplify_fraction(int *numerator, int *denominator) {
int a = *numerator, b = *denominator;
int remainder;
// 使用辗转相除法求最大公约数
while (b != 0) {
remainder = a % b;
a = b;
b = remainder;
}
// 约分
*numerator /= a;
*denominator /= a;
}
int main() {
double input;
int integer, numerator, denominator;
// 从标准输入中读取小数
scanf("%lf", &input);
// 将小数分解为整数和小数部分
integer = (int) input;
numerator = (int) ((input - integer) * 10000000);
denominator = 10000000;
// 将整数和小数部分合并为一个分数
numerator += integer * denominator;
// 对分数进行约分
simplify_fraction(&numerator, &denominator);
// 输出结果
if (numerator >= denominator) {
printf("%d %d %d\n", numerator / denominator, numerator % denominator, denominator);
} else {
printf("0 %d %d\n", numerator, denominator);
}
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!