求助一道题,没有思路
本帖最后由 零的执行人 于 2020-5-20 17:55 编辑有理数的显示
计算机中的实数其实是有理数,因为其小数点的位数是有限的,从这个意义上讲,计算机中的数值均为有理数(整数也是有理数)。编写程序,对从键盘上输入的若干个有理数,均按有理数的形式输出。输入格式:每行一个有理数,以换行符表示结束,或为一个整数,或两个整数之商(整数,分号,整数间无空格),或为一个带小数点的实数(小数点后不超过4位小数)。测试数确保不会出现分母为零的情形。输出格式:输出的有理数处于一对[]中,要求:若为零,输出为; 若分母为1,输出为整数形式(只输出分子);分母必为正整数;分数形式的分子,分母必须没有公因子(即约过分的),但可以是假分数形式(分子可以大于分母)。输入样例:
0.0
-125/ -5
12.4321
-666
输出样例:
[-666]
没有思路T T,求助大佬教学一下
每行一个有理数我知道有多少行? 我觉得:
我觉得首先你看
有三种输入格式,你判断输入的数据使这三种的哪种格式:
1.是用 .
2.是用/
3.是用 直接输入
二.例如: 直接输入整数和0的你就可以直接控制输出格式做一个字符串([])的组拼输出
输入12.4321这一类的你需要用字符数组或者字符串接收数据 根据数组下标求出 小数点后有几位然后控制一下输出格式
-125/ -5这一类的你需要用字符数组或者字符串接收数据然后字符转成数字 判断是否是有理数是有理数的话 输出计算的结果然后控制输出格式
判断是哪种输入方式我想的方法是 每次接收到字符串货字符数组的从头扫描有.的就是12.4321这一类 有/的就是-125/5这类 如果两者都没有就是第一种直接输入整数和0 本帖最后由 永恒的蓝色梦想 于 2020-5-21 12:57 编辑
如果满意,不妨给个最佳{:10_297:}#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
typedef long long ll;
ll gcd(ll a, ll b) {
ll t = 0;
while (b) {
t = a % b;
a = b;
b = t;
}
return a;
}
int main() {
long long a, b, t, temp;
for (;;) {
scanf("%lld", &a);
temp = getchar();
if (temp == '\n') {
printf("[%lld]\n", a);
}
else {
if (temp == '/') {
scanf("%lld", &b);
}
else if (temp == '.') {
for (b = 1; (temp = getchar()) != '\n'; b *= 10) {
a = temp - 48 + a * 10;
}
}
if (a) {
t = gcd(a, b);
if (t == b) {
printf("[%lld]\n", a / t);
}
else {
printf("[%lld/%lld]\n", a / t, b / t);
}
}
else {
puts("");
}
}
}
return 0;
} 永恒的蓝色梦想 发表于 2020-5-20 18:07
我知道有多少行?
每行一个,按回车结束好像就好啦 永恒的蓝色梦想 发表于 2020-5-20 18:07
我知道有多少行?
#include <stdio.h>
typedef long long ll;
//求最大公约数
llf1(ll a, ll b) {
ll t = 0;
while (b) {
t = a % b;
a = b;
b = t;
}
return a;
}
int main() {
ll a, b, t, temp;
if(scanf("%lld", &a)==1)
{
//scanf("%lld", &a);
temp = getchar();
if (temp == '\n') {
printf("[%lld]\n", a);
return 0;
}
else {
if (temp == '/') {
if(scanf("%lld", &b)!=1)
return 0;
}
else if (temp == '.') {
for (b = 1; ((temp = getchar()) !='\n')&&((temp = getchar())); b *= 10) {
a = temp - 48 + a * 10;//字符串转换为数值
}
}
if (a&&b) {
t = f1(a, b);
if (t == b) {//如果最大公约数是b
printf("[%lld]\n", a / t);
return 0;
}
else {
printf("[%lld/%lld]\n", a / t, b / t);
return 0;
}
}
else {
puts("");
return 0;
}
}
}
}
还是没有通过,请问怎么控制小数的时候比如2.ab读入非数字时不执行字符串转换成数字呢? 零的执行人 发表于 2020-5-22 11:57
还是没有通过,请问怎么控制小数的时候比如2.ab读入非数字时不执行字符串转换成数字呢?
每行一个有理数,以换行符表示结束,或为一个整数,或两个整数之商(整数,分号,整数间无空格),或为一个带小数点的实数(小数点后不超过4位小数)。测试数确保不会出现分母为零的情形。题目要求说只会带数字。 零的执行人 发表于 2020-5-22 11:57
还是没有通过,请问怎么控制小数的时候比如2.ab读入非数字时不执行字符串转换成数字呢?
for (b = 1; ((temp = getchar()) !='\n')&&((temp = getchar())); b *= 10) {
a = temp - 48 + a * 10;//字符串转换为数值乱改代码,过了就奇怪了 永恒的蓝色梦想 发表于 2020-5-22 12:06
乱改代码,过了就奇怪了
不好意思哈哈,这里发成错的了 我提交以后它显示;warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result。scanf的返回值正在被忽略。我输入2.a;结果是他把a也转换成有理数了T T
页:
[1]