求助控制数字转换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,怎么修改??
之前的帖不能回复了,重发一下 呃呃呃,这里是代码,上面的粘贴错了
#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;
}
}
}
}
我输入2.a;结果是他把a这样的非数字类型字符也转换成有理数了T T,怎么修改??那你想得到什么结果 就是有不是数字的字符就不执行了呀{:10_324:}
不能把字母也转换了吧 零的执行人 发表于 2020-5-22 12:34
就是有不是数字的字符就不执行了呀
不能把字母也转换了吧
这一行不出结果,还是忽略字符
而且输入非数字字符难道不是非法输入? 就是不出结果,直接return 0了吧。。。那个OJ测评的好像没有算非法字符。。在本地编译器内不会出现
PTA平台的编译器使用的是GCC编译器,该编译器对scanf的返回值进行检查,如果忽略scanf的返回值,将会出现警告。然后就全部不通过 本帖最后由 永恒的蓝色梦想 于 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:52
这不简单?
貌似。。。在DEVC上还是把字母转换了。。
输入样例
8/a
a/8
2.a
a.2
输出样例
这不对吧{:10_291:} 零的执行人 发表于 2020-5-22 12:58
貌似。。。在DEVC上还是把字母转换了。。
输入样例
8/a
你是有病啊,非要搞非法输入 零的执行人 发表于 2020-5-22 12:58
貌似。。。在DEVC上还是把字母转换了。。
输入样例
8/a
算了你说不清楚题目,把题目发给我 本帖最后由 零的执行人 于 2020-5-22 13:49 编辑
永恒的蓝色梦想 发表于 2020-5-22 13:07
算了你说不清楚题目,把题目发给我
有理数的显示
计算机中的实数其实是有理数,因为其小数点的位数是有限的,从这个意义上讲,计算机中的数值均为有理数(整数也是有理数)。编写程序,对从键盘上输入的若干个有理数,均按有理数的形式输出。
输入格式:
每行一个有理数,以换行符表示结束,或为一个整数,或两个整数之商(整数,分号,整数间无空格),或为一个带小数点的实数(小数点后不超过4位小数)。 测试数确保不会出现分母为零的情形。
输出格式:
输出的有理数处于一对[]中,要求:若为零,输出为; 若分母为1,输出为整数形式(只输出分子);分母必为正整数;分数形式的分子,分母必须没有公因子(即约过分的),但可以是假分数形式(分子可以大于分母)。
输入样例:
0.0
-125/ -5
12.4321
-666
输出样例:
[-666]
永恒的蓝色梦想 发表于 2020-5-22 12:52
这不简单?
我搞错了大哥{:10_266:}。。不通过点是
-0.5
-3.3
零的执行人 发表于 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]