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

求助控制数字转换C语言

#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'); 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;
            }
      }
    }

   
}


我提交以后它显示;
warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result。
scanf的返回值正在被忽略。
我输入2.a;结果是他把a这样的非数字类型字符也转换成有理数了T T,怎么修改??
之前的帖不能回复了,重发一下

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

呃呃呃,这里是代码,上面的粘贴错了


#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'); 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;
            }
      }
    }

   
}

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

我输入2.a;结果是他把a这样的非数字类型字符也转换成有理数了T T,怎么修改??那你想得到什么结果

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

就是有不是数字的字符就不执行了呀{:10_324:}
不能把字母也转换了吧

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

零的执行人 发表于 2020-5-22 12:34
就是有不是数字的字符就不执行了呀
不能把字母也转换了吧

这一行不出结果,还是忽略字符
而且输入非数字字符难道不是非法输入?

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

就是不出结果,直接return 0了吧。。。那个OJ测评的好像没有算非法字符。。在本地编译器内不会出现
PTA平台的编译器使用的是GCC编译器,该编译器对scanf的返回值进行检查,如果忽略scanf的返回值,将会出现警告。然后就全部不通过

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

本帖最后由 永恒的蓝色梦想 于 2020-5-23 15:18 编辑

零的执行人 发表于 2020-5-22 12:39
就是不出结果,直接return 0了吧。。。那个OJ测评的好像没有算非法字符。。在本地编译器内不会出现
PTA平 ...

这不简单?#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
typedef unsigned long long ull;



ull gcd(ull a, ull b) {
    ull t = 0;
    while (b) {
      t = a % b;
      a = b;
      b = t;
    }
    return a;
}



int main() {
    char temp;
    unsigned long long a, b, t;
    bool flag;


    for (;;) {
      if ((temp = getchar()) == '\n') {
            continue;
      }
      else if (temp == '-') {
            flag = true;
            a = 0;
      }
      else if (temp == '+') {
            flag = false;
            a = 0;
      }
      else {
            flag = false;
            a = temp - 48;
      }

      for (;; a = a * 10 + (temp - 48)) {
            temp = getchar();

            if (temp == '\n') {
                if (a) {
                  if (flag) {
                        printf("[-%llu]\n", a);
                  }
                  else {
                        printf("[%llu]\n", a);
                  }
                }
                else {
                  puts("");
                }

                break;
            }
            else if (temp == '/') {
                if (a) {
                  if ((temp = getchar()) == '-') {
                        flag = !flag;
                        b = 0;
                  }
                  else if (temp == '+') {
                        b = 0;
                  }
                  else {
                        b = temp - 48;
                  }

                  while ((temp = getchar()) != '\n') {
                        b = b * 10 + (temp - 48);
                  }

                  t = gcd(a, b);

                  putchar('[');

                  if (flag) {
                        putchar('-');
                  }

                  if (b == t) {
                        printf("%llu]\n", a / b);
                  }
                  else {
                        printf("%llu/%llu]\n", a / t, b / t);
                  }
                }
                else {
                  puts("");
                }

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

                t = gcd(a, b);

                putchar('[');

                if (flag) {
                  putchar('-');
                }

                if (b == t) {
                  printf("%llu]\n", a / b);
                }
                else {
                  printf("%llu/%llu]\n", a / t, b / t);
                }

                break;
            }
      }
    }

    return 0;
}

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

永恒的蓝色梦想 发表于 2020-5-22 12:52
这不简单?

貌似。。。在DEVC上还是把字母转换了。。
输入样例
8/a
a/8
2.a
a.2
输出样例




这不对吧{:10_291:}

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

零的执行人 发表于 2020-5-22 12:58
貌似。。。在DEVC上还是把字母转换了。。
输入样例
8/a


你是有病啊,非要搞非法输入

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

零的执行人 发表于 2020-5-22 12:58
貌似。。。在DEVC上还是把字母转换了。。
输入样例
8/a


算了你说不清楚题目,把题目发给我

零的执行人 发表于 2020-5-22 13:22:17

本帖最后由 零的执行人 于 2020-5-22 13:49 编辑

永恒的蓝色梦想 发表于 2020-5-22 13:07
算了你说不清楚题目,把题目发给我

有理数的显示

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

输出样例:



[-666]

零的执行人 发表于 2020-5-23 13:33:42

永恒的蓝色梦想 发表于 2020-5-22 12:52
这不简单?

我搞错了大哥{:10_266:}。。不通过点是
-0.5

-3.3

永恒的蓝色梦想 发表于 2020-5-23 15:17:55

零的执行人 发表于 2020-5-23 13:33
我搞错了大哥。。不通过点是
-0.5



#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
typedef unsigned long long ull;



ull gcd(ull a, ull b) {
    ull t = 0;
    while (b) {
      t = a % b;
      a = b;
      b = t;
    }
    return a;
}



int main() {
    char temp;
    unsigned long long a, b, t;
    bool flag;


    for (;;) {
      if ((temp = getchar()) == '\n') {
            continue;
      }
      else if (temp == '-') {
            flag = true;
            a = 0;
      }
      else if (temp == '+') {
            flag = false;
            a = 0;
      }
      else {
            flag = false;
            a = temp - 48;
      }

      for (;; a = a * 10 + (temp - 48)) {
            temp = getchar();

            if (temp == '\n') {
                if (a) {
                  if (flag) {
                        printf("[-%llu]\n", a);
                  }
                  else {
                        printf("[%llu]\n", a);
                  }
                }
                else {
                  puts("");
                }

                break;
            }
            else if (temp == '/') {
                if (a) {
                  if ((temp = getchar()) == '-') {
                        flag = !flag;
                        b = 0;
                  }
                  else if (temp == '+') {
                        b = 0;
                  }
                  else {
                        b = temp - 48;
                  }

                  while ((temp = getchar()) != '\n') {
                        b = b * 10 + (temp - 48);
                  }

                  t = gcd(a, b);

                  putchar('[');

                  if (flag) {
                        putchar('-');
                  }

                  if (b == t) {
                        printf("%llu]\n", a / b);
                  }
                  else {
                        printf("%llu/%llu]\n", a / t, b / t);
                  }
                }
                else {
                  puts("");
                }

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

                t = gcd(a, b);

                putchar('[');

                if (flag) {
                  putchar('-');
                }

                if (b == t) {
                  printf("%llu]\n", a / b);
                }
                else {
                  printf("%llu/%llu]\n", a / t, b / t);
                }

                break;
            }
      }
    }

    return 0;
}
页: [1]
查看完整版本: 求助控制数字转换C语言