鱼C论坛

 找回密码
 立即注册
查看: 1119|回复: 12

[已解决]求助控制数字转换C语言

[复制链接]
发表于 2020-5-22 12:28:04 | 显示全部楼层 |阅读模式

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

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

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

    
}
我提交以后它显示;
warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result。
scanf的返回值正在被忽略。
我输入2.a;结果是[69/10]他把a这样的非数字类型字符也转换成有理数了T T,怎么修改??
之前的帖不能回复了,重发一下
最佳答案
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("[0]");
                }

                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("[0]");
                }

                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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-22 12:30: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'); 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;
            }
        }
    }

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

使用道具 举报

发表于 2020-5-22 12:32:08 | 显示全部楼层
我输入2.a;结果是[69/10]他把a这样的非数字类型字符也转换成有理数了T T,怎么修改??
那你想得到什么结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 12:34:25 | 显示全部楼层
就是有不是数字的字符就不执行了呀
不能把字母也转换了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-22 12:35:42 | 显示全部楼层
零的执行人 发表于 2020-5-22 12:34
就是有不是数字的字符就不执行了呀
不能把字母也转换了吧


这一行不出结果,还是忽略字符
而且输入非数字字符难道不是非法输入?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 12:39:44 | 显示全部楼层
就是不出结果,直接return 0了吧。。。那个OJ测评的好像没有算非法字符。。在本地编译器内不会出现
PTA平台的编译器使用的是GCC编译器,该编译器对scanf的返回值进行检查,如果忽略scanf的返回值,将会出现警告。然后就全部不通过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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("[0]");
                }

                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("[0]");
                }

                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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 12:58:53 | 显示全部楼层

貌似。。。在DEVC上还是把字母转换了。。
输入样例
8/a
a/8
2.a
a.2
输出样例
[8/3]
[10]
[69/10]
[10]
这不对吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-22 13:06:03 | 显示全部楼层
零的执行人 发表于 2020-5-22 12:58
貌似。。。在DEVC上还是把字母转换了。。
输入样例
8/a

你是有病啊,非要搞非法输入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-22 13:07:18 | 显示全部楼层
零的执行人 发表于 2020-5-22 12:58
貌似。。。在DEVC上还是把字母转换了。。
输入样例
8/a

算了你说不清楚题目,把题目发给我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 13:22:17 | 显示全部楼层
本帖最后由 零的执行人 于 2020-5-22 13:49 编辑
永恒的蓝色梦想 发表于 2020-5-22 13:07
算了你说不清楚题目,把题目发给我


有理数的显示

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

输出样例:
[0]
[25]
[124321/10000]
[-666]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-23 13:33:42 | 显示全部楼层

我搞错了大哥。。不通过点是
-0.5
[1/2]
-3.3
[27/-10]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 15:17:55 | 显示全部楼层
零的执行人 发表于 2020-5-23 13:33
我搞错了大哥。。不通过点是
-0.5
[1/2]
#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("[0]");
                }

                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("[0]");
                }

                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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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