第二十行那里,为什么每次都会执行
本帖最后由 小丑9 于 2023-2-1 19:47 编辑这个代码目的是,输入五个数,找到只出现一次的数,并输出。
第二十行那里,为什么每次都会执行,当我的输入是 8 5 3 5 8
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int m;
int a;
for (int i = 0;i<5;i++)
{
scanf("%d", &m);
a = m;
}//读取数据
int tag = 1;
for (int i = 0 ; i < 5; i++)//让所有的数都与数组里的数进行异或
{
for (int n = i ; n < 5; n++)
{
if (0 == a ^ a)//若异或后值为零,说明两个数相等,tag加一
tag++;
}
if (2 == tag)//因为是与数组里所有的数相比,包括本身,所以tag必定会加一,taf为2时,没有相同的数
printf("%d\n", a);
}
} 本帖最后由 isdkz 于 2023-2-1 20:35 编辑
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int m;
int a;
for (int i = 0;i<5;i++)
{
scanf("%d", &m);
a = m;
}//读取数据
int tag;
for (int i = 0 ; i < 5; i++)//让所有的数都与数组里的数进行异或
{
tag = 1;
for (int n = 0 ; n < 5; n++)
{
if (a == a)
tag++;
}
if (2 == tag)//因为是与数组里所有的数相比,包括本身,所以tag必定会加一,taf为2时,没有相同的数
printf("只出现一次的数:%d\n", a);
}
} i=0 a ^ a a^a
i=1 a ^ a a^a
也只有这个时候才会执行吧。 本帖最后由 isdkz 于 2023-2-1 22:24 编辑
第一:对 tag 的初始化应该放在外循环里面,不然的话对于数组后面的元素 tag 没有重置
第二:n 的初始值也应该为 0,因为对于每一个元素有可能跟它重复的数不止在它的后面,也有可能在它的前面
第三:运算符优先级问题,== 的优先级优于 ^,所以你应该加个小括号改变优先级
对你的代码修改如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int m;
int a;
for (int i = 0;i<5;i++)
{
scanf("%d", &m);
a = m;
}//读取数据
int tag;
for (int i = 0 ; i < 5; i++)//让所有的数都与数组里的数进行异或
{
tag = 1; // 1、在外循环中对 tag 初始化
for (int n = 0 ; n < 5; n++) // 2、n 的初始值应该为 0
{
if (0 == (a ^ a))//若异或后值为零,说明两个数相等,tag加一 3、加小括号改变优先级
tag++;
}
if (2 == tag)//因为是与数组里所有的数相比,包括本身,所以tag必定会加一,taf为2时,没有相同的数
printf("只出现一次的数:%d\n", a);
}
} 加上解释了,如果解答了您的疑惑,一个最佳答案是对我莫大的鼓励 本帖最后由 桃花飞舞 于 2023-2-1 23:06 编辑
你的思路没错,只是少了细节,我改了下
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int m;
int a;
for (int i = 0;i<5;i++)
{
scanf("%d", &m);
a = m;
}//读取数据
int tag = 1;
for (int i = 0 ; i < 5; i++)//让所有的数都与数组里的数进行异或
{
tag = 1; //这里的每一个数开始做异或之前都要把tag清为1
for (int n = 0 ; n < 5; n++) //这里n 从零开始而不是从i开始
{
if (0 == (a ^ a))//若异或后值为零,说明两个数相等,tag加一 这里加了()
tag++;
}
if (2 == tag)//因为是与数组里所有的数相比,包括本身,所以tag必定会加一,taf为2时,没有相同的数
printf("%d\n", a);
}
}
楼上的解释很清楚了
页:
[1]