零的执行人 发表于 2020-5-20 17:52:32

求助一道题,没有思路

本帖最后由 零的执行人 于 2020-5-20 17:55 编辑

有理数的显示

计算机中的实数其实是有理数,因为其小数点的位数是有限的,从这个意义上讲,计算机中的数值均为有理数(整数也是有理数)。编写程序,对从键盘上输入的若干个有理数,均按有理数的形式输出。输入格式:每行一个有理数,以换行符表示结束,或为一个整数,或两个整数之商(整数,分号,整数间无空格),或为一个带小数点的实数(小数点后不超过4位小数)。测试数确保不会出现分母为零的情形。输出格式:输出的有理数处于一对[]中,要求:若为零,输出为; 若分母为1,输出为整数形式(只输出分子);分母必为正整数;分数形式的分子,分母必须没有公因子(即约过分的),但可以是假分数形式(分子可以大于分母)。输入样例:
0.0
-125/ -5
12.4321
-666


输出样例:



[-666]
没有思路T T,求助大佬教学一下


永恒的蓝色梦想 发表于 2020-5-20 18:07:13

每行一个有理数我知道有多少行?

辟邪 发表于 2020-5-20 18:36:58

我觉得:
我觉得首先你看
有三种输入格式,你判断输入的数据使这三种的哪种格式:
1.是用 .
2.是用/
3.是用 直接输入   
二.例如: 直接输入整数和0的你就可以直接控制输出格式做一个字符串([])的组拼输出
               输入12.4321这一类的你需要用字符数组或者字符串接收数据   根据数组下标求出 小数点后有几位然后控制一下输出格式
                -125/ -5这一类的你需要用字符数组或者字符串接收数据然后字符转成数字 判断是否是有理数是有理数的话   输出计算的结果然后控制输出格式
判断是哪种输入方式我想的方法是   每次接收到字符串货字符数组的从头扫描有.的就是12.4321这一类   有/的就是-125/5这类   如果两者都没有就是第一种直接输入整数和0

永恒的蓝色梦想 发表于 2020-5-20 19:29:33

本帖最后由 永恒的蓝色梦想 于 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-22 11:54:25

永恒的蓝色梦想 发表于 2020-5-20 18:07
我知道有多少行?

每行一个,按回车结束好像就好啦

零的执行人 发表于 2020-5-22 11:57:27

永恒的蓝色梦想 发表于 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:59:11

零的执行人 发表于 2020-5-22 11:57
还是没有通过,请问怎么控制小数的时候比如2.ab读入非数字时不执行字符串转换成数字呢?

每行一个有理数,以换行符表示结束,或为一个整数,或两个整数之商(整数,分号,整数间无空格),或为一个带小数点的实数(小数点后不超过4位小数)。测试数确保不会出现分母为零的情形。题目要求说只会带数字。

永恒的蓝色梦想 发表于 2020-5-22 12:06:00

零的执行人 发表于 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:15:32

永恒的蓝色梦想 发表于 2020-5-22 12:06
乱改代码,过了就奇怪了

不好意思哈哈,这里发成错的了

零的执行人 发表于 2020-5-22 12:22:33

我提交以后它显示;warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result。scanf的返回值正在被忽略。我输入2.a;结果是他把a也转换成有理数了T T
页: [1]
查看完整版本: 求助一道题,没有思路