鱼C论坛

 找回密码
 立即注册
查看: 1733|回复: 7

[已解决]代码有错误么?

[复制链接]
发表于 2019-1-29 16:49:26 | 显示全部楼层 |阅读模式

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

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

x
题目描述:
已知鸡和兔的总数量
nn
n,总腿数为
mm
m。请输出鸡和兔的只数。
输入:
每行两个整数(不超过100000)分别表示
n,mn,m
n,m。多组输入,以EOF做结束。
输出:
每行输出两个数,分别是鸡和兔的数目。如果不能求解,则输出"No answer"
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int n[100],m[100],x[100],y[100],i,k=0;
  5.         for(i=0;i<100;i++)
  6.         {
  7.                 scanf("%d %d",&n[i],&m[i]);
  8.                 k+=1;
  9.                 if(n[i]==EOF&&m[i]==EOF) break;
  10.         }
  11.         for(i=0;i<k;i++)
  12.         {
  13.                 x[i] = (m[i] -2*n[i])/2;
  14.                 y[i] = n[i] - x[i];
  15.         }
  16.         for(i=0;i<k;i++)
  17.         {
  18.                         if(x[i] < 0 ||y[i] < 0||m[i]%2!=0)
  19.                         printf("No answer\n");
  20.                         else
  21.                         printf("%d %d\n",y[i],x[i]);
  22.        
  23.         }
  24.         return 0;
  25. }
复制代码
最佳答案
2019-1-29 19:35:07
EOF的判断条件是while(scanf("%d%d",&n,&m)!=EOF),下面是我写的代码,你看看能不能看懂
#include<stdio.h>
int main()
{
    int m,n,x,y;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        x = (m -2*n)/2;
        y = n - x;
        if(x < 0 ||y < 0||m%2!=0)
            printf("No answer\n");
        else
            printf("%d %d\n",y,x);
    }
    return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-1-29 19:35:07 | 显示全部楼层    本楼为最佳答案   
EOF的判断条件是while(scanf("%d%d",&n,&m)!=EOF),下面是我写的代码,你看看能不能看懂
#include<stdio.h>
int main()
{
    int m,n,x,y;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        x = (m -2*n)/2;
        y = n - x;
        if(x < 0 ||y < 0||m%2!=0)
            printf("No answer\n");
        else
            printf("%d %d\n",y,x);
    }
    return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-29 21:19:22 | 显示全部楼层
迷雾道长 发表于 2019-1-29 19:35
EOF的判断条件是while(scanf("%d%d",&n,&m)!=EOF),下面是我写的代码,你看看能不能看懂
#include
int ...

在输入两个-1后无法跳出循环
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-1 10:55:03 | 显示全部楼层
NYJYA 发表于 2019-1-29 21:19
在输入两个-1后无法跳出循环


你对scanf函数有误解,scanf函数的返回值是正确读取参数个数,你输入两个-1,scanf能够读取到两个%d,因此返回值为2,而不是EOF,所以程序不会结束。
把迷雾道长的程序中while循环判断条件改为  while(scanf("%d%d",&m,&n)==2)可能会更好一些,只要是没有把m、n两个参数同时读取到就结束循环。
若是你打算以输入两个-1结束程序,那么则需要进一步修改。
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int m,n,x,y;
  5.     scanf("%d%d",&m,&n);
  6.     while(m!=-1&&n!=-1)
  7.     {
  8.         x = (m -2*n)/2;
  9.         y = n - x;
  10.         if(x < 0 ||y < 0||m%2!=0)
  11.             printf("No answer\n");
  12.         else
  13.             printf("%d %d\n",y,x);
  14.         scanf("%d%d",&m,&n);
  15.     }
  16.     return 0;
  17. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-2 20:11:20 | 显示全部楼层
sunrise085 发表于 2019-2-1 10:55
你对scanf函数有误解,scanf函数的返回值是正确读取参数个数,你输入两个-1,scanf能够读取到两个%d, ...

谢谢,但是我想问一下EOF不是-1吗?所以结束条件不应该是输入-1吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-3 21:46:05 | 显示全部楼层
NYJYA 发表于 2019-1-29 21:19
在输入两个-1后无法跳出循环

你想要在输入那里实现那个EOF就输入ctrl+z就是实现不输入的情况,也就是题目的那种情况
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-3 21:46:41 | 显示全部楼层
NYJYA 发表于 2019-2-2 20:11
谢谢,但是我想问一下EOF不是-1吗?所以结束条件不应该是输入-1吗?

EOF是输入ctrl+z
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-4 23:52:11 | 显示全部楼层

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 07:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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