C++ C++;按数字比较两个数字

C++ C++;按数字比较两个数字,c++,numbers,compare,digits,C++,Numbers,Compare,Digits,我想创建一个函数,当输入中提供的两个数字由相同的数字组成时(不替换),该函数返回true 例如,543和435应返回true,10001和11000应返回true,但111222和122222应返回false 我读过一些关于位掩码的内容,但还没有真正理解,你能帮我吗?我认为处理这个问题的最简单方法是使用桶。创建一个长度为10的std::vector(每个数字一个),然后在运行相应数字时增加索引。通过比较向量完成: bool compare_digits(int x, int y) { s

我想创建一个函数,当输入中提供的两个数字由相同的数字组成时(不替换),该函数返回true

例如,543和435应返回true,10001和11000应返回true,但111222和122222应返回false


我读过一些关于位掩码的内容,但还没有真正理解,你能帮我吗?

我认为处理这个问题的最简单方法是使用桶。创建一个长度为10的
std::vector
(每个数字一个),然后在运行相应数字时增加索引。通过比较向量完成:

bool compare_digits(int x, int y) {
    std::vector<int> x_vec(10), y_vec(10);
    while(x != 0) { //!= instead of > so that we can handle negatives
        x_vec.at(x%10)++; //increment whatever digit is in the 1's place
        x /= 10; //chop off the 1's place digit
    }

    while(y != 0) { //repeat for y
        y_vec.at(y%10)++;
        y /= 10;
    }

    //check if they had the same digits
    return (x_vec == y_vec);
}
bool比较数字(整数x,整数y){
std::向量x_-vec(10),y_-vec(10);
而(x!=0){/!=而不是>,这样我们就可以处理负片了
x_vec.at(x%10)+;//递增1处的任何数字
x/=10;//切掉1的位数
}
当(y!=0){//对y重复
(y%10)+时的向量;
y/=10;
}
//检查他们是否有相同的数字
返回(x_vec==y_vec);
}

我能想到的处理这个问题的最简单方法是使用桶。创建一个长度为10的
std::vector
(每个数字一个),然后在运行相应数字时增加索引。通过比较向量完成:

bool compare_digits(int x, int y) {
    std::vector<int> x_vec(10), y_vec(10);
    while(x != 0) { //!= instead of > so that we can handle negatives
        x_vec.at(x%10)++; //increment whatever digit is in the 1's place
        x /= 10; //chop off the 1's place digit
    }

    while(y != 0) { //repeat for y
        y_vec.at(y%10)++;
        y /= 10;
    }

    //check if they had the same digits
    return (x_vec == y_vec);
}
bool比较数字(整数x,整数y){
std::向量x_-vec(10),y_-vec(10);
而(x!=0){/!=而不是>,这样我们就可以处理负片了
x_vec.at(x%10)+;//递增1处的任何数字
x/=10;//切掉1的位数
}
当(y!=0){//对y重复
(y%10)+时的向量;
y/=10;
}
//检查他们是否有相同的数字
返回(x_vec==y_vec);
}

如果每个数字的计数(出现次数)相同,则由相同数字组成的两个数字。下面是一些通用基(模板参数)的代码

模板
布尔比较_位数(整数x,整数y)
{
//0排除不重要的情况
如果(x>base*y | y>base*x)
返回false;
//1计算x中数字的出现次数
int count[base]={0};
对于(;x;x/=基)
++计数[x%基数];
//2减去y中的数字计数,如果结果<0:返回false
对于(;y;y/=基)
如果(--计数[y%基数]<0)
返回false;
//3检查计数[]==0
for(int i=0;i!=base;++i)
如果(计数[i])返回false;
返回true;
}

如果每个数字的计数(出现次数)相同,则由相同数字组成的两个数字。下面是一些通用基(模板参数)的代码

模板
布尔比较_位数(整数x,整数y)
{
//0排除不重要的情况
如果(x>base*y | y>base*x)
返回false;
//1计算x中数字的出现次数
int count[base]={0};
对于(;x;x/=基)
++计数[x%基数];
//2减去y中的数字计数,如果结果<0:返回false
对于(;y;y/=基)
如果(--计数[y%基数]<0)
返回false;
//3检查计数[]==0
for(int i=0;i!=base;++i)
如果(计数[i])返回false;
返回true;
}

您可以计算每个数字在数字中出现的次数,也可以尝试对数字进行排序,然后比较数值。如果使用
x%10
它会给出底部的数字。如果使用
x/10
,则会删除底部数字。然后,您可以对每个数字中的数字进行计数或排序并进行比较。将数字转换为std::string并使用std::map或仅使用int数组[10];“我读过一些关于位掩码的内容,但并不真正了解”这不是位掩码的使用案例。它们用于完全不同的目的。你想干什么?我们可以将数字拆分为数字,将它们放到
std::map
,然后比较地图。我投票将这个问题作为离题题结束,因为没有试图解决这个问题。由于没有写出对未来用户没有帮助的答案,我们只能发表评论。您可以计算每个数字在数字中出现的次数,或者您可以尝试对数字进行排序,然后比较数值。如果使用
x%10
,则会给出底部数字。如果使用
x/10
,则会删除底部数字。然后,您可以对每个数字中的数字进行计数或排序并进行比较。将数字转换为std::string并使用std::map或仅使用int数组[10];“我读过一些关于位掩码的内容,但并不真正了解”这不是位掩码的使用案例。它们用于完全不同的目的。你想干什么?我们可以将数字拆分为数字,将它们放到
std::map
,然后比较地图。我投票将这个问题作为离题题结束,因为没有试图解决这个问题。没有写下答案对未来的用户没有帮助,我们只能发表评论。我认为没有必要对模运算使用绑定检查。如果您不想创建单独的函数,只需使用lambda,代码重复是问题的根源。@Slava我想当您谈论边界检查时,您是在引用我在下标运算符上使用的
.at()
?我不认为这会对这里的运行时间产生影响,这可能是一个崭露头角的C++程序员的好习惯,所以我不认为我会改变它。你说我应该怎么做?“这可能是个好习惯”我不这么认为,它与C++的一个主要原则相冲突:“我不应该为我不使用的东西付费”。对于lambda,我指的是将
int
转换为vector@Slava这是保险。你可以用,也可以不用。在你真正需要它之前,你不会知道你是否需要使用它。到那时已经太晚了。我更愿意将我所有的下标
.at()
,以很低的价格放到运行时,因为这一次可以节省我5个小时的调试时间。我认为没有必要对模运算使用绑定检查。A.