鱼C论坛

 找回密码
 立即注册
查看: 1412|回复: 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 编辑

如果满意,不妨给个最佳
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. typedef long long ll;



  4. ll gcd(ll a, ll b) {
  5.     ll t = 0;
  6.     while (b) {
  7.         t = a % b;
  8.         a = b;
  9.         b = t;
  10.     }
  11.     return a;
  12. }



  13. int main() {
  14.     long long a, b, t, temp;


  15.     for (;;) {
  16.         scanf("%lld", &a);
  17.         temp = getchar();

  18.         if (temp == '\n') {
  19.             printf("[%lld]\n", a);
  20.         }

  21.         else {
  22.             if (temp == '/') {
  23.                 scanf("%lld", &b);
  24.             }

  25.             else if (temp == '.') {
  26.                 for (b = 1; (temp = getchar()) != '\n'; b *= 10) {
  27.                     a = temp - 48 + a * 10;
  28.                 }
  29.             }

  30.             if (a) {
  31.                 t = gcd(a, b);

  32.                 if (t == b) {
  33.                     printf("[%lld]\n", a / t);
  34.                 }
  35.                 else {
  36.                     printf("[%lld/%lld]\n", a / t, b / t);
  37.                 }
  38.             }

  39.             else {
  40.                 puts("[0]");
  41.             }
  42.         }
  43.     }

  44.     return 0;
  45. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-20 18:07:13 | 显示全部楼层
  1. 每行一个有理数
复制代码
我知道有多少行?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

如果满意,不妨给个最佳
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. typedef long long ll;



  4. ll gcd(ll a, ll b) {
  5.     ll t = 0;
  6.     while (b) {
  7.         t = a % b;
  8.         a = b;
  9.         b = t;
  10.     }
  11.     return a;
  12. }



  13. int main() {
  14.     long long a, b, t, temp;


  15.     for (;;) {
  16.         scanf("%lld", &a);
  17.         temp = getchar();

  18.         if (temp == '\n') {
  19.             printf("[%lld]\n", a);
  20.         }

  21.         else {
  22.             if (temp == '/') {
  23.                 scanf("%lld", &b);
  24.             }

  25.             else if (temp == '.') {
  26.                 for (b = 1; (temp = getchar()) != '\n'; b *= 10) {
  27.                     a = temp - 48 + a * 10;
  28.                 }
  29.             }

  30.             if (a) {
  31.                 t = gcd(a, b);

  32.                 if (t == b) {
  33.                     printf("[%lld]\n", a / t);
  34.                 }
  35.                 else {
  36.                     printf("[%lld/%lld]\n", a / t, b / t);
  37.                 }
  38.             }

  39.             else {
  40.                 puts("[0]");
  41.             }
  42.         }
  43.     }

  44.     return 0;
  45. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

每行一个,按回车结束好像就好啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 11:57:27 | 显示全部楼层
  1. #include <stdio.h>
  2. typedef long long ll;
  3. //求最大公约数
  4. ll  f1(ll a, ll b) {
  5.     ll t = 0;
  6.     while (b) {
  7.         t = a % b;
  8.         a = b;
  9.         b = t;
  10.     }
  11.     return a;
  12. }
  13. int main() {
  14.     ll a, b, t, temp;


  15.     if(scanf("%lld", &a)==1)
  16.         {
  17.        
  18.         //scanf("%lld", &a);
  19.         temp = getchar();

  20.         if (temp == '\n') {
  21.             printf("[%lld]\n", a);
  22.             return 0;
  23.         }
  24.                
  25.         else {
  26.             if (temp == '/') {
  27.                     if(scanf("%lld", &b)!=1)
  28.                     return 0;
  29.             }

  30.             else if (temp == '.') {
  31.                 for (b = 1; ((temp = getchar()) !='\n')&&((temp = getchar())); b *= 10) {
  32.                     a = temp - 48 + a * 10;//字符串转换为数值
  33.                 }
  34.             }

  35.             if (a&&b) {
  36.                 t = f1(a, b);

  37.                 if (t == b) {//如果最大公约数是b
  38.                     printf("[%lld]\n", a / t);
  39.                     return 0;
  40.                 }
  41.                 else {
  42.                     printf("[%lld/%lld]\n", a / t, b / t);
  43.                     return 0;
  44.                 }
  45.             }

  46.             else {
  47.                 puts("[0]");
  48.                 return 0;
  49.             }
  50.         }
  51.     }

  52.    
  53. }

复制代码

还是没有通过,请问怎么控制小数的时候比如  2.ab读入非数字时不执行字符串转换成数字呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2020-5-22 12:06:00 | 显示全部楼层
零的执行人 发表于 2020-5-22 11:57
还是没有通过,请问怎么控制小数的时候比如  2.ab读入非数字时不执行字符串转换成数字呢?
  1.                 for (b = 1; ((temp = getchar()) !='\n')&&((temp = getchar())); b *= 10) {
  2.                     a = temp - 48 + a * 10;//字符串转换为数值
复制代码
乱改代码,过了就奇怪了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不好意思哈哈,这里发成错的了
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 18:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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