万福泉源 2024-03-18 09:33 采纳率: 63.6%
浏览 10
已结题

while(scanf("%d"),&a);的含义。

描述
在提瓦特大陆,蒙德城的图书馆管理员丽莎最近在研究一种古老的法术,这种法术可以强化蒙德城的防御力。为了使法术生效,她需要找到一种特定的晶石——风之晶,这种晶石在大陆上广泛分布,但只有数量最多的那种晶石才能发挥最大的魔法效果。
在提瓦特大陆的某个区域,有一个大小为n的晶石数组,代表着该区域内不同类型的风之晶的分布。你的任务是帮助丽莎找到其中的主要晶石。
主要晶石是指在晶石数组中出现次数大于⌊ n/2 ⌋的晶石。
旅行者(玩家)需要使用他们的智慧和力量,确保能够找到这种主要晶石,以强化蒙德城的防御法术。
输入
输入一个晶石数组,长度为n(1<n<=1000000)。
晶石数组中一定存在主要晶石。
输出
主要晶石
输入样例

1 7 5 6 7 7 7 7 7 9

输出样例

7

我的代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a;
    int flag;
    int s=0;
    while(scanf("%d",&a))
    {
        if(s==0)
        {
            flag=a;
            s++;
        }
        else
        {
            if(a==flag)
                s++;
            else
                s--;
        }
    }
    printf("%d",flag);
    return 0;
}




我把scanf("%d",&a)换成cin>>a就可以(当然用C++),但为什么C语言这个输出不了结果?

  • 写回答

4条回答 默认 最新

  • 码农阿豪@新空间 优质创作者: Java、后端开发技术领域 2024-03-18 09:33
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    你的代码有可能会出现死循环,导致无法输出结果。原因在于你的while循环条件中用了scanf()函数,当输入的不是数字时,scanf()函数会返回0,但循环条件中没有加入判断,会一直继续读入,从而导致死循环。你可以尝试改成以下代码,对读入是否成功进行判断,避免死循环。另外需要注意,题目要求输出主要晶石,而你的代码输出的是出现次数最多的晶石,需要稍作修改。
    #include <stdio.h>
    #include <stdlib.h>
    int main(){
        int a;
        int flag;
        int cnt=0; //出现次数
        while(scanf("%d",&a)==1) //判断读入是否成功
        {
            if(cnt==0)
            {
                flag=a;
                cnt++;
            }
            else
            {
                if(a==flag)
                    cnt++;
                else
                    cnt--;
            }
        }
        printf("%d",flag);
        return 0;
    }
    

    以上代码输出的是主要晶石。若要输出出现次数最多的晶石,则需要额外记录一个变量maxCnt代表当前出现次数最多的晶石的出现次数,当cnt比maxCnt大时,更新maxCnt和晶石编号flag。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月30日
  • 已采纳回答 6月22日
  • 创建了问题 3月18日