如何判断4个整数都不相等?

时间:2022-12-06 23:58:47
4个整数 i1 , i2 , i3 , i4

怎样判断它们都不相等?

关键是写法要霸气.

不要这种 i1 != i2 ,i1 != i3 , i1 != i4 , i2 != i3 , i2 != i4 , i3 != i4 哈.


谢谢

43 个解决方案

#1



sum = i1+i2+i3+i4;
average = (i1+i2+i3+i4)/4;
if(sum == average*4)
四个数相等;
else
四个数不等;

因为是整数,所以可以这么做

#2


上面那个有问题

average1 = (i1+i2+i3+i4)/4;
average2 = (i1+i2+i3)/3;
if(sum == average1 * 4 && sum == average2 * 3)
四个数全相等;
else
四个数不全等;

这个是判断不全相等
要判断全不相等,暂时没有想出比较好的方法

#3



        a[4] = {i1, i2, i3, i4};
equal = 0;
for(i = 0; i < 4; ++i)
{
for(j = i; j < 3; ++j)
{
if(a[j] == a[j+1])
{
equal = 1;
break;
}
}
}
if(equal == 0;)
四个数全不相等;

楼主弄个数组,双重循环就解决了,想不出霸气的写法

#4


那就用递归,简单得来又不失霸气。

#5


int a[] = {i1, i2, i3, i4};
int n = sizeof(a) / sizeof(int);
if (count_if(a, a + n, bind2nd(equal<int>(), *a)) == n)
   //全相等; 

#6


用位运算解决吧!每位比较。

#7



#include <algorithm>
namespace std;

int a[] = {1, 2, 3, 4};
int n = sizeof(a) / sizeof(int);
if (count(a, a + n, *a) == n)
{
//全相等
}

#8


定义宏

#define ALL_DIFFERENT(i1, i2, i3, i4) (i1 != i2 && i1 != i3 && i1 != i4 && i2 != i3 && i2 != i4 && i3 != i4 )

#9


霸气有什么用,霸气对CPU又没有价值,只会使效率更低罢了

#10


这个一个NP问题,复杂度是O(n!),没有什么好办法。
只能用递归,老老实实算吧。

#11


写法要霸气。。。
楼主,你要求太高了。。。

#12


合并相同的数,然后计算结果数目是不是4,用给量子计算专用的算法,把4个数朝天上一扔,然后检查是否相同的数落到了同一个杯子里,最后看看共有几个杯子有数字,如果是4个,就表明这4个数全不相同。

#13


引用 2 楼 udbwcso 的回复:
上面那个有问题
C/C++ code
sum = i1+i2+i3+i4;
average1 = (i1+i2+i3+i4)/4;
average2 = (i1+i2+i3)/3;
if(sum == average1 * 4 &amp;&amp; sum == average2 * 3)
    四个数全相等;
else
    四个数不全等;


这个是判断不全相等
要判断全不相等,暂时没有想出比较好的方法

你只考虑了非负数的情况,如果是:
i1=1,i2=2,i3=-3,i4=0
sum=0
average1=0
average2=0
你的结果是全相等,但实际不是。

可以用空间换时间方法,也就是类似#12楼的方法:
long a[2*N_MAX]={0};//空间(可动态分配)
int m[N]={M1,M2,..,MN};//比较的个数N,且m[N]里的最大值<N_MAX
for(i=0;i<N;i++){
  m[i]+=N_MAX; //转换成正数(0<m[i]<2*N_MAX)
  a[m[i]]++; //计算重复数量
}
if(a[m[0]]==N) return;//全等
for(i=0;i<N;i++){
  if(a[m[i]]>1) break;
}
if(i==N){
  //全不等
}else{
  //部分相等
}

#14


简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
    //用户说是
}
else{
    //用户说否
}

#15


引用 14 楼 kenshu 的回复:
简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
  //用……


偶像....

#16


.....

#17


引用 14 楼 kenshu 的回复:
简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
  //用……

跟俺的算法有一拼啊,不过您这个更霸气。

#18


C# 凑下热闹

bool result = (new int[] { i1, i2, i3, i4 }).Distinct().Count() < 4;

#19


如果4个整数不大于65535,可以用这个方法。

UINT64 i, j = 12345678;
int a = 1234;
int b = 2345;
int c = 15678;
int d = 7890;

//i=0x1ed23d3e092904d2;
*((USHORT*)&i + 0) = a;
*((USHORT*)&i + 1) = b;
*((USHORT*)&i + 2) = c;
*((USHORT*)&i + 3) = d;

if (i == j)
{
printf("i=j\n");
}
else
{
printf("i!=j\n");
}

#20


少了个步骤,如果4个数都不大于65535,可以把4个数,合并为一个64位的整数来运算。

UINT64 i, j;

int a = 1234;
int b = 2345;
int c = 15678;
int d = 7890;

int e = 12347;
int f = 23459;
int g = 56788;
int h = 23457;

//i=0x1ed23d3e092904d2;
*((USHORT*)&i + 0) = a;
*((USHORT*)&i + 1) = b;
*((USHORT*)&i + 2) = c;
*((USHORT*)&i + 3) = d;

//j = 0x5ba1ddd45ba3303b
*((USHORT*)&j + 0) = e;
*((USHORT*)&j + 1) = f;
*((USHORT*)&j + 2) = g;
*((USHORT*)&j + 3) = h;

if (i == j)
{
printf("i=j\n");
}
else
{
printf("i!=j\n");
}

#21


不好意思,看错题目。 如何判断4个整数都不相等?

#22


会用正则表达式吗?如果会,那写起来就很霸气,但估计生成源代码就很长,执行效率也不高。绝对比
i1 != i2 ,i1 != i3 , i1 != i4 , i2 != i3 , i2 != i4 , i3 != i4 生成的源代码长。

   char str[256];
   sprintf(str, "%d,%d,%d,%d", i1, i2, i3, i4;
   Re = /(?:^|,)(\d+),(:?.*,)?\1(?:,|$)/ig;
   if (Re.test(str))
      //有重复数字出现;
   else
      //没有重复,即全不相等
 

#23


鼓励编程简单易懂,不追求过多的花哨!

#24


lz sb

#25


引用 14 楼 kenshu 的回复:
简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
    ……


确实很霸气!

#26


这个不就是正解,怎么没人理???
引用 6 楼 uself 的回复:
用位运算解决吧!每位比较。

#27


if(a & b & c & d == a)
不过要求a是最大的

现在弱弱的问,我是不是把问题转化为求最大值了

引用 26 楼 myknowledge 的回复:
这个不就是正解,怎么没人理???

引用 6 楼 uself 的回复:
用位运算解决吧!每位比较。

#28


if((a & b & c & d == a)&&(a | b | c | d == a))
{
//四个全部相同
}
else
{
}
这下应该是对了吧???

#29


(a&b&c&c) == (a|b|c|d)

#30


楼上两位,计算的都是 

!(4个数全相等)

而楼主的问题是

4个数全不等.

---------------------
楼主的问题,用位运算说不定也可以,但像这种效率和可读性要选择一个平衡点的/*并且可读性高的性能不一定低,或至少是不会低太多*/

一般人都很容易选吧.

#31


你先给我解释一下什么叫霸气

#32


引用 17 楼 jennyvenus 的回复:
...
跟俺的算法有一拼啊,不过您这个更霸气。
...

其实如果数字非常多(比如几十万个来比较),用CMapPtrToPtr会非常好理解,而且一般人写不出那个速度.
这个方法跟您楼上说向天上丢硬币,是一个思路.

#33


还要霸气。。。直接Hello World!好了

#34


引用 1 楼 udbwcso 的回复:
C/C++ code

sum = i1+i2+i3+i4;
average = (i1+i2+i3+i4)/4;
if(sum == average*4)
    四个数相等;
else
    四个数不等;


因为是整数,所以可以这么做

有问题啊!!!!!!!

#35


引用 14 楼 kenshu 的回复:
简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
    ……
好能搞。。。

#36


6个异或可以接受不???

#37


	if((a-b==0)&&(b-c==0)&&(c-d==0))

#38


引用 14 楼 kenshu 的回复:
简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
    ……

人眼识别算法,强悍。。

#39


关键不是摄像头识别人眼,而是人眼识别屏幕。。

#40


这个太。。。蛋疼了。

#41


引用 38 楼 oldmtn 的回复:
引用 14 楼 kenshu 的回复:

简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUES……



非常霸气!太强悍了!!!

#42


引用 14 楼 kenshu 的回复:
简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
    ……


差点笑喷了,给力啊。。

#43


霸气顶个鸟用

#1



sum = i1+i2+i3+i4;
average = (i1+i2+i3+i4)/4;
if(sum == average*4)
四个数相等;
else
四个数不等;

因为是整数,所以可以这么做

#2


上面那个有问题

average1 = (i1+i2+i3+i4)/4;
average2 = (i1+i2+i3)/3;
if(sum == average1 * 4 && sum == average2 * 3)
四个数全相等;
else
四个数不全等;

这个是判断不全相等
要判断全不相等,暂时没有想出比较好的方法

#3



        a[4] = {i1, i2, i3, i4};
equal = 0;
for(i = 0; i < 4; ++i)
{
for(j = i; j < 3; ++j)
{
if(a[j] == a[j+1])
{
equal = 1;
break;
}
}
}
if(equal == 0;)
四个数全不相等;

楼主弄个数组,双重循环就解决了,想不出霸气的写法

#4


那就用递归,简单得来又不失霸气。

#5


int a[] = {i1, i2, i3, i4};
int n = sizeof(a) / sizeof(int);
if (count_if(a, a + n, bind2nd(equal<int>(), *a)) == n)
   //全相等; 

#6


用位运算解决吧!每位比较。

#7



#include <algorithm>
namespace std;

int a[] = {1, 2, 3, 4};
int n = sizeof(a) / sizeof(int);
if (count(a, a + n, *a) == n)
{
//全相等
}

#8


定义宏

#define ALL_DIFFERENT(i1, i2, i3, i4) (i1 != i2 && i1 != i3 && i1 != i4 && i2 != i3 && i2 != i4 && i3 != i4 )

#9


霸气有什么用,霸气对CPU又没有价值,只会使效率更低罢了

#10


这个一个NP问题,复杂度是O(n!),没有什么好办法。
只能用递归,老老实实算吧。

#11


写法要霸气。。。
楼主,你要求太高了。。。

#12


合并相同的数,然后计算结果数目是不是4,用给量子计算专用的算法,把4个数朝天上一扔,然后检查是否相同的数落到了同一个杯子里,最后看看共有几个杯子有数字,如果是4个,就表明这4个数全不相同。

#13


引用 2 楼 udbwcso 的回复:
上面那个有问题
C/C++ code
sum = i1+i2+i3+i4;
average1 = (i1+i2+i3+i4)/4;
average2 = (i1+i2+i3)/3;
if(sum == average1 * 4 &amp;&amp; sum == average2 * 3)
    四个数全相等;
else
    四个数不全等;


这个是判断不全相等
要判断全不相等,暂时没有想出比较好的方法

你只考虑了非负数的情况,如果是:
i1=1,i2=2,i3=-3,i4=0
sum=0
average1=0
average2=0
你的结果是全相等,但实际不是。

可以用空间换时间方法,也就是类似#12楼的方法:
long a[2*N_MAX]={0};//空间(可动态分配)
int m[N]={M1,M2,..,MN};//比较的个数N,且m[N]里的最大值<N_MAX
for(i=0;i<N;i++){
  m[i]+=N_MAX; //转换成正数(0<m[i]<2*N_MAX)
  a[m[i]]++; //计算重复数量
}
if(a[m[0]]==N) return;//全等
for(i=0;i<N;i++){
  if(a[m[i]]>1) break;
}
if(i==N){
  //全不等
}else{
  //部分相等
}

#14


简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
    //用户说是
}
else{
    //用户说否
}

#15


引用 14 楼 kenshu 的回复:
简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
  //用……


偶像....

#16


.....

#17


引用 14 楼 kenshu 的回复:
简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
  //用……

跟俺的算法有一拼啊,不过您这个更霸气。

#18


C# 凑下热闹

bool result = (new int[] { i1, i2, i3, i4 }).Distinct().Count() < 4;

#19


如果4个整数不大于65535,可以用这个方法。

UINT64 i, j = 12345678;
int a = 1234;
int b = 2345;
int c = 15678;
int d = 7890;

//i=0x1ed23d3e092904d2;
*((USHORT*)&i + 0) = a;
*((USHORT*)&i + 1) = b;
*((USHORT*)&i + 2) = c;
*((USHORT*)&i + 3) = d;

if (i == j)
{
printf("i=j\n");
}
else
{
printf("i!=j\n");
}

#20


少了个步骤,如果4个数都不大于65535,可以把4个数,合并为一个64位的整数来运算。

UINT64 i, j;

int a = 1234;
int b = 2345;
int c = 15678;
int d = 7890;

int e = 12347;
int f = 23459;
int g = 56788;
int h = 23457;

//i=0x1ed23d3e092904d2;
*((USHORT*)&i + 0) = a;
*((USHORT*)&i + 1) = b;
*((USHORT*)&i + 2) = c;
*((USHORT*)&i + 3) = d;

//j = 0x5ba1ddd45ba3303b
*((USHORT*)&j + 0) = e;
*((USHORT*)&j + 1) = f;
*((USHORT*)&j + 2) = g;
*((USHORT*)&j + 3) = h;

if (i == j)
{
printf("i=j\n");
}
else
{
printf("i!=j\n");
}

#21


不好意思,看错题目。 如何判断4个整数都不相等?

#22


会用正则表达式吗?如果会,那写起来就很霸气,但估计生成源代码就很长,执行效率也不高。绝对比
i1 != i2 ,i1 != i3 , i1 != i4 , i2 != i3 , i2 != i4 , i3 != i4 生成的源代码长。

   char str[256];
   sprintf(str, "%d,%d,%d,%d", i1, i2, i3, i4;
   Re = /(?:^|,)(\d+),(:?.*,)?\1(?:,|$)/ig;
   if (Re.test(str))
      //有重复数字出现;
   else
      //没有重复,即全不相等
 

#23


鼓励编程简单易懂,不追求过多的花哨!

#24


lz sb

#25


引用 14 楼 kenshu 的回复:
简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
    ……


确实很霸气!

#26


这个不就是正解,怎么没人理???
引用 6 楼 uself 的回复:
用位运算解决吧!每位比较。

#27


if(a & b & c & d == a)
不过要求a是最大的

现在弱弱的问,我是不是把问题转化为求最大值了

引用 26 楼 myknowledge 的回复:
这个不就是正解,怎么没人理???

引用 6 楼 uself 的回复:
用位运算解决吧!每位比较。

#28


if((a & b & c & d == a)&&(a | b | c | d == a))
{
//四个全部相同
}
else
{
}
这下应该是对了吧???

#29


(a&b&c&c) == (a|b|c|d)

#30


楼上两位,计算的都是 

!(4个数全相等)

而楼主的问题是

4个数全不等.

---------------------
楼主的问题,用位运算说不定也可以,但像这种效率和可读性要选择一个平衡点的/*并且可读性高的性能不一定低,或至少是不会低太多*/

一般人都很容易选吧.

#31


你先给我解释一下什么叫霸气

#32


引用 17 楼 jennyvenus 的回复:
...
跟俺的算法有一拼啊,不过您这个更霸气。
...

其实如果数字非常多(比如几十万个来比较),用CMapPtrToPtr会非常好理解,而且一般人写不出那个速度.
这个方法跟您楼上说向天上丢硬币,是一个思路.

#33


还要霸气。。。直接Hello World!好了

#34


引用 1 楼 udbwcso 的回复:
C/C++ code

sum = i1+i2+i3+i4;
average = (i1+i2+i3+i4)/4;
if(sum == average*4)
    四个数相等;
else
    四个数不等;


因为是整数,所以可以这么做

有问题啊!!!!!!!

#35


引用 14 楼 kenshu 的回复:
简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
    ……
好能搞。。。

#36


6个异或可以接受不???

#37


	if((a-b==0)&&(b-c==0)&&(c-d==0))

#38


引用 14 楼 kenshu 的回复:
简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
    ……

人眼识别算法,强悍。。

#39


关键不是摄像头识别人眼,而是人眼识别屏幕。。

#40


这个太。。。蛋疼了。

#41


引用 38 楼 oldmtn 的回复:
引用 14 楼 kenshu 的回复:

简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUES……



非常霸气!太强悍了!!!

#42


引用 14 楼 kenshu 的回复:
简单的我不会,霸气我就会

CString ls;
long i[4] = {1,2,3,4};

ls.Format("%d,%d,%d,%d\r\n是请按\"是\",不是请按\"否\"",i[0],i[1],i[2],i[3]);
if (MessageBox(ls,"下面4个数是否全不相等?",MB_YESNO|MB_ICONQUESTION) == IDYES){
    ……


差点笑喷了,给力啊。。

#43


霸气顶个鸟用