C++中如何比较数组未知数量元素?判断输入数字是否有重复数位
判断数字数位是否存在重复的C++实现
方法一:基于你现有代码的改进
你已经成功提取了数字的每一位到analyse数组中,接下来只需要检查数组内是否有重复元素即可。可以用双重循环实现:外层循环遍历每个数位,内层循环遍历当前数位之后的所有数位,一旦发现相等值,就说明存在重复。
修改后的完整代码如下:
#include<iostream> int main(){ int number, number_help; std::cin>>number; number_help = number ; int digitcount{0}; while(number_help>0){ number_help/=10; digitcount+=1; } int analyse[digitcount]{}; int temp_num = number; // 用临时变量存原数字,避免修改原number影响后续 for(size_t i {0}; i<digitcount ; i++){ analyse[i] = temp_num%10; temp_num/=10; } // 检查重复的逻辑 bool has_duplicate = false; for(int i = 0; i < digitcount; i++){ for(int j = i + 1; j < digitcount; j++){ if(analyse[i] == analyse[j]){ has_duplicate = true; // 找到重复后直接跳出所有循环 goto end_check; } } } end_check: if(has_duplicate){ std::cout << "该数字的数位存在重复" << std::endl; } else { std::cout << "该数字的数位没有重复" << std::endl; } return 0; }
方法二:更高效的实现(无需统计位数)
其实不需要先统计位数再存储数位,因为数字的每一位只能是0-9这10个数字,我们可以用一个布尔数组记录每个数字是否已经出现过。每次取当前数字的最后一位,检查对应的标记是否为true:如果是,说明重复;否则标记为true,然后把数字除以10继续处理,直到数字变为0。
这种方法时间复杂度更低,代码也更简洁:
#include<iostream> int main(){ int number; std::cin >> number; // 处理0的特殊情况 if(number == 0){ std::cout << "该数字的数位没有重复" << std::endl; return 0; } // 转为正数处理负数情况 if(number < 0){ number = -number; } bool digit_seen[10] = {false}; // 初始所有数字都未出现过 bool has_duplicate = false; while(number > 0){ int digit = number % 10; if(digit_seen[digit]){ has_duplicate = true; break; } digit_seen[digit] = true; number /= 10; } if(has_duplicate){ std::cout << "该数字的数位存在重复" << std::endl; } else { std::cout << "该数字的数位没有重复" << std::endl; } return 0; }
补充说明
- 第二种方法不需要额外统计位数,也不需要存储所有数位,空间和时间效率都更高。
- 代码中加入了负数处理逻辑,确保输入负数时也能正确判断。
内容的提问来源于stack exchange,提问作者Mhz_rkx
相关产品推荐
相关产品推荐

