C语言--判断输入的整数中数字是否有重复

本文介绍了一个简单的C语言程序,用于输入一个整数,输出其位数并检查数字是否重复。通过使用bool型数组记录每个数字是否出现过,可以有效判断整数中的数字是否有重复。
//  repeat.c
//  day05
//
//  从键盘输入一个整数,如:12345,输出这个数的位数并判断这个整数中的数字是否有重复。
//  Created by apple on 13-6-6.
//  Copyright (c) 2013年 apple. All rights reserved.
//

#include <stdio.h>
#include<stdbool.h>
int main()
{
    long int num,temp;
    int i=1;
    printf("请输入一个整数:");
    scanf("%ld",&num);
    temp = num;
    
    //获取所输入整数的位数。
    while(temp/10>0){
        i+=1;
        temp = temp/10;
    }
    
    //打印所输入整数的位数,并定义一个bool型数组。
    printf("该数为%d位数。\n",i);
    bool a[i+1];
    
    //初始化数组中所有元素为0.
    for(int j=0;j<i+1;j++){
        a[j] = 0;
    }
    
    //判断是否有重复的数字。
    <span style="color:#ff0000;">do{
        int n = num % 10;
        if(a[n]==1){
            printf("出现重复了。\n");
            break;
        }
        a[n] = 1;
        num /= 10;
    }while(num);</span>
    
    if(num==0){
        printf("没有重复。\n");
    }
    
    return 0;
}


                
<think> 我们已从引用中提取了多个判断素数的C语言代码片段,并总结出优化方法。现在需要编写一个完整的程序,实现输入整数判断是否为素数。 根据引用,我们可以采用以下优化: 1. 排除小于等于1的数(非素数) 2. 单独处理2(是素数) 3. 排除所有偶数(除了2) 4. 只检查奇数因子,且检查范围到平方根即可 我们将采用方法3(进一步优化)来实现。 注意:用户输入的是正整数,所以不需要考虑负数,但需要包括1(非素数)。 代码步骤: 1. 读取输入的正整数n 2. 判断n是否小于等于1 -> 非素数 3. 判断n是否为2 -> 素数 4. 判断n是否为偶数(大于2的偶数)-> 非素数 5. 对于奇数n,从3开始到sqrt(n)(取整),步长为2,检查是否有因子 6. 如果有因子则不是素数,否则是素数。 同时,我们也可以考虑用户可能需要多次输入,所以可以设计一个循环(但题目没有要求,所以先实现一次输入)。 根据引用[4],使用sqrt函数需要包含math.h,并且注意sqrt(n)只需要计算一次。 下面给出代码: </think> 以下是几种用 C 语言实现正整数素数判断的高效方法,结合数学优化和边界处理: ### 方法 1:平方根优化法(推荐) ```c #include <stdio.h> #include <math.h> int isPrime(int n) { if(n <= 1) return 0; // 排除 ≤1 的数 if(n == 2) return 1; // 单独处理2(唯一偶素数) if(n % 2 == 0) return 0; // 排除所有偶数 int limit = (int)sqrt(n) + 1; // 优化:只需检查到 √n for(int i = 3; i <= limit; i += 2) { // 只检查奇数因子 if(n % i == 0) return 0; } return 1; } int main() { int num; printf("输入整数:"); scanf("%d", &num); printf("%d %s素数\n", num, isPrime(num) ? "是" : "不是"); return 0; } ``` **优化点**: 1. 时间复杂度 $O(\sqrt{n}/2)$,比基础实现快 20 倍以上 2. 使用 `i += 2` 跳过偶数因子检查 3. 提前计算 `sqrt(n)` 避免重复运算 4. 边界条件 `+1` 确保不漏检 **编译注意**:链接数学库 `gcc prime.c -lm` --- ### 方法 2:n/2 优化法(无数学库) ```c #include <stdio.h> int isPrime(int n) { if(n <= 1) return 0; if(n == 2) return 1; if(n % 2 == 0) return 0; for(int i = 3; i <= n/2; i += 2) { // 检查到 n/2 if(n % i == 0) return 0; } return 1; } ``` **适用场景**: - 嵌入式设备等无数学库环境 - 处理较小数字($n < 10^6$) --- ### 方法 3:循环输入版(引用[3]增强) ```c #include <stdio.h> #include <math.h> int main() { int n; while(scanf("%d", &n) != EOF) { // 支持连续输入 if(n <= 1) printf("No\n"); else if(n == 2) printf("Yes\n"); else { int limit = sqrt(n) + 1; int isPrime = 1; // 假设是素数 for(int i = 2; i <= limit; i++) { if(n % i == 0) { isPrime = 0; break; } } printf(isPrime ? "Yes\n" : "No\n"); } } return 0; } ``` ### 数学原理 素数检查只需遍历到 $\sqrt{n}$ 的原因: 若 $n$ 有因子 $d$,则必存在配对因子 $n/d$。当 $d \leq \sqrt{n}$ 时,$n/d \geq \sqrt{n}$,因此检查较小的因子即可覆盖所有可能性[^4]。 ### 特殊值处理 | 输入值 | 素数判断 | 处理逻辑 | |--------|----------|-----------------------| | 1 | 否 | 定义上非素数 | | 2 | 是 | 唯一偶素数 | | 偶数 | 否 | 直接返回(除2外) | | 负数 | 否 | 输入时需约束为正整数 | > **性能对比**:当 $n = 10^9+7$(大素数)时,方法1仅需约 $\sqrt{n}/2 \approx 1.5万$ 次循环,而基础方法需 $5亿$ 次循环。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值