我无语了,请教ACM输入输出格式

pang123hui 2010-11-20 10:44:03
最近,小弟开始接触ACM试题,不敢做难的,就是找点简单的做做。

但因为是新手,对其输入输出格式不是很清楚,以至于总是提示答案错误,请指教。

题目:

Description
编写一个C程序,实现两个分数的加减法

Input
输入包含多行数据
每行数据是一个字符串,格式是"a/boc/d"。

其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。

数据以EOF结束
输入数据保证合法

Output
对于输入数据的每一行输出两个分数的运算结果。
注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数

Sample Input

1/8+3/8
1/4-1/2
1/3-1/3

Sample Output

1/2
-1/4
0

一开始先是犯了一个错误,就是我以外多行输入是一次性输入,然后EOF后,一次性给出结果——结果:错
但百度之后好像不是这样,是输入一行,回车,出结果,再输入一行,回车,出结果……直到EOF,程序结束——结果:还错

我把程序贴出来请大家看看,第一次接触ACM,程序写的很白痴,误怪


#include <stdio.h>
#define ADS(n) ((n)>=0)?(n):(-n)

int count = 0;
int first_num = 0, second_num = 0, first_no = 0, second_no = 0;



int gcd(int m,int n)
{
if (m < n)
{
int tmp = m;
m = n;
n = tmp;
}
if (n == 0)
return m;
else
return gcd(n,m % n);
}
int gbs(int m,int n)
{
if (m < n)
{
int tmp = m;
m = n;
n = tmp;
}
return m*n/gcd(m,n);
}

void go_count(void)
{
int result_num,result_no;
result_no = gbs(first_no, second_no);
//printf("\n");
if(1 == count)
{
result_num = first_num * result_no / first_no + second_num * result_no / second_no;
if(result_num != 0)
{
printf("%d/%d\n", result_num / gcd(result_num, result_no), result_no / gcd(result_num, result_no));
}
else
{
printf("0\n");
}
}
else if(2 == count)
{
result_num = first_num * result_no / first_no - second_num * result_no / second_no;
if(result_num != 0)
{
printf("%d/%d\n", result_num / gcd(ADS(result_num), ADS(result_no)), result_no / gcd(ADS(result_num), ADS(result_no)));
}
else
{
printf("0\n");
}

}
}

int main(void)
{
int ch;
int num = 1;


while((ch = getchar()) != EOF)
{


if(ch == '+')
{
count = 1;
}
else if(ch == '-')
{
count = 2;
}
else if(ch >= '0' && ch <= '9')
{
if(1 == num)
{
first_num = ch - 48;
num++;
}
else if(2 == num)
{
first_no = ch - 48;
num++;
}
else if(3 == num)
{
second_num = ch -48;
num++;
}
else if(4 == num)
{
second_no = ch - 48;
num++;
}
}
else if(ch == '\n')
{
num = 1;
go_count();
}

}
return 0;
}



...全文
666 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
yutianzuijin 2011-03-09
  • 打赏
  • 举报
回复
偶也在做这个题,怎么也是这种错误。最后怎么解决的?
callmenp 2010-11-20
  • 打赏
  • 举报
回复
这页是讲题目的输入输出方式的
http://poj.org/problem?id=1000
nexttech1 2010-11-20
  • 打赏
  • 举报
回复
学些了
無_1024 2010-11-20
  • 打赏
  • 举报
回复
看错了 是c语言啊 那就是逐个读取字符串的字符 遇到数字就换成十进制 遇到 / 就定制当前数字的转换 进入下一个数字的转换 遇到运算符就用一个字符记录它用一个switch选择所需的操作 后面的分数以此类推
無_1024 2010-11-20
  • 打赏
  • 举报
回复
利用c++重载输入运算符
liutengfeigo 2010-11-20
  • 打赏
  • 举报
回复
多做几个就好了。
pang123hui 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 denganliang825 的回复:]

我也在做顶嵌杯,呵呵,我也不清楚这个输入输出,楼主源码好啊
[/Quote]

呵呵,遇到同行了阿,这个初赛题目很简单,只是以前没做过ACM,对这个输入输出格式很无语
「已注销」 2010-11-20
  • 打赏
  • 举报
回复
我也在做顶嵌杯,呵呵,我也不清楚这个输入输出,楼主源码好啊
过去的我 2010-11-20
  • 打赏
  • 举报
回复
把每行scanf到一个字符串里再解析吧
hk2305621_1 2010-11-20
  • 打赏
  • 举报
回复
要全面考虑,尤其是特殊数据。
想两个分数的运算结果为整数的,输出就只有整数了。
hk2305621_1 2010-11-20
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>

char s[8];

int gcd(int a, int b) {
return b % a ? gcd(b%a, a) : a;
}

int main(void) {

int a1, a2, b1, b2;
char op;
int t, c1, c2;
while(gets(s) != NULL) {
a1 = s[0] - '0';
b1 = s[2] - '0';
op = s[3];
a2 = s[4] - '0';
b2 = s[6] - '0';

if(op == '+') {
c1 = a1 * b2 + a2 * b1;
c2 = b1 * b2;
if(c1 == 0) {
printf("0\n");
} else {
t = gcd(c1, c2);
// printf("gcd %d %d %d \n", t, c1, c2);
if(c2 == t) {
printf("%d\n", c1 / t);
} else {
printf("%d/%d\n", c1/t, c2/t);
}
}
} else {
c1 = a1 * b2 - a2 * b1;
c2 = b1 * b2;

if(c1 == 0) {
printf("0\n");
} else if(c1 < 0) {
c1 = -1 * c1;
t = gcd(c1, c2);
if(c2 == t) {
printf("-%d\n", c1 / t);
} else {
printf("-%d/%d\n", c1/t, c2/t);
}
} else {
t = gcd(c1, c2);
if(c2 == t) {
printf("%d\n", c1 / t);
} else {
printf("%d/%d\n", c1/t, c2/t);
}
}
}
}
return 0;
}


考虑不够完全
pang123hui 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 callmenp 的回复:]

请测试这组数据:
C/C++ code

1/8+3/8
1/4-1/2
1/3-1/3
1/1+1/1
1/1+0/1
1/1-0/1
1/2+1/2


结果应该是
C/C++ code

1/2
-1/4
0
2
1
1
1


这个过了应该就差不多了
[/Quote]

过了,还是提示错误,我在想想吧,谢谢你了
mstlq 2010-11-20
  • 打赏
  • 举报
回复
acm的输入和输出是分开的……
所以楼主的两种方式都可行……

错误是逻辑错误,说完
callmenp 2010-11-20
  • 打赏
  • 举报
回复
请测试这组数据:

1/8+3/8
1/4-1/2
1/3-1/3
1/1+1/1
1/1+0/1
1/1-0/1
1/2+1/2

结果应该是

1/2
-1/4
0
2
1
1
1

这个过了应该就差不多了
callmenp 2010-11-20
  • 打赏
  • 举报
回复
不是。。。我说的是1/2+1/2
话说我在比赛结束前给您提供测试数据貌似不太好。。。
但是。。。请把分给我点儿吧。。。我刚注册的号,穷啊
pang123hui 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 callmenp 的回复:]

* 您还是不要用手工输入数据了,把数据放到input文件里,然后
命令行: ./a.out < input
* 您没有考虑分母为1的情况
[/Quote]

因为输入的量不大,所以没有重定向输入输出
pang123hui 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 callmenp 的回复:]

* 您还是不要用手工输入数据了,把数据放到input文件里,然后
命令行: ./a.out < input
* 您没有考虑分母为1的情况
[/Quote]

哦,你说的是输入
4+4/7
这种吧,确实,必须输入
4/1+4/7
才可以,恩,谢谢提醒,我看看是不是这个问题导致答案错误
callmenp 2010-11-20
  • 打赏
  • 举报
回复
* 您还是不要用手工输入数据了,把数据放到input文件里,然后
命令行: ./a.out < input
* 您没有考虑分母为1的情况
pang123hui 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 callmenp 的回复:]

引用 9 楼 pang123hui 的回复:

引用 8 楼 callmenp 的回复:

这页是讲题目的输入输出方式的
http://poj.org/problem?id=1000


貌似没有我要的


喔,刚才看了下你这代码,你的结果是错的,和输入输出无关
[/Quote]

对的阿,不知道你是怎么输入的,我再次用gcc编译试了下,可以的

panghuicpp@panghuicpp-laptop:~/tmp$ ./a.out
1/8+3/8
1/2
1/4-1/2
-1/4
1/3-1/3
0

结果没有问题阿,请严格按照输入格式输入数据
callmenp 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pang123hui 的回复:]

引用 8 楼 callmenp 的回复:

这页是讲题目的输入输出方式的
http://poj.org/problem?id=1000


貌似没有我要的
[/Quote]

喔,刚才看了下你这代码,你的结果是错的,和输入输出无关
加载更多回复(1)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧