鱼C论坛

 找回密码
 立即注册
查看: 1116|回复: 9

[已解决]求助一道题,没有思路

[复制链接]
发表于 2020-5-20 17:52:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

有理数的显示

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


输出样例:
[0]
[25]
[124321/10000]
[-666]
没有思路T T,求助大佬教学一下


最佳答案
2020-5-20 19:29:33
本帖最后由 永恒的蓝色梦想 于 2020-5-21 12:57 编辑

如果满意,不妨给个最佳
#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("[0]");
            }
        }
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-20 18:07:13 | 显示全部楼层
每行一个有理数
我知道有多少行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-20 18:36:58 | 显示全部楼层
我觉得:
我觉得首先你看  
有三种输入格式,你判断输入的数据使这三种的哪种格式:
1.是用 .
2.是用/
3.是用 直接输入   
二.例如  : 直接输入整数和0的  你就可以直接控制输出格式做一个字符串([])的组拼输出
                 输入12.4321  这一类的你需要用字符数组或者字符串接收数据   根据数组下标求出 小数点后有几位  然后  控制一下输出格式
                -125/ -5这一类的你需要用字符数组或者字符串接收数据  然后字符转成数字 判断是否是有理数  是有理数的话   输出计算的结果  然后控制输出格式
判断是哪种输入方式  我想的方法是   每次接收到字符串货字符数组的  从头扫描  有.的就是12.4321这一类   有/的就是-125/5这类   如果两者都没有就是第一种直接输入整数和0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-20 19:29:33 | 显示全部楼层    本楼为最佳答案   
本帖最后由 永恒的蓝色梦想 于 2020-5-21 12:57 编辑

如果满意,不妨给个最佳
#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("[0]");
            }
        }
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 11:54:25 | 显示全部楼层

每行一个,按回车结束好像就好啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 11:57:27 | 显示全部楼层
#include <stdio.h>
typedef long long ll;
//求最大公约数 
ll  f1(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("[0]");
                return 0;
            }
        }
    }

    
}
还是没有通过,请问怎么控制小数的时候比如  2.ab读入非数字时不执行字符串转换成数字呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

每行一个有理数,以换行符表示结束,或为一个整数,或两个整数之商(整数,分号,整数间无空格),或为一个带小数点的实数(小数点后不超过4位小数)。测试数确保不会出现分母为零的情形。
题目要求说只会带数字。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;//字符串转换为数值
乱改代码,过了就奇怪了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 12:15:32 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-22 12:06
乱改代码,过了就奇怪了

不好意思哈哈,这里发成错的了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 12:22:33 | 显示全部楼层
我提交以后它显示;warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result。scanf的返回值正在被忽略。我输入2.a;结果是[69/10]他把a也转换成有理数了T T
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 17:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表