爱编程的小芒果 2024-12-16 20:32 采纳率: 75%
浏览 26

崩溃了,不知道哪错了

崩溃了
我们定义一个“lucky"数为只有一位数字不同,其余位数上的数字都相同。给定a,b,求a~b(包括a,b)里共有多少个“lucky"数?

注:像“222202”、“3444”、“10000”这样的数都是"lucky"数,而“10010”就不是。a≤b≤1000000000000
我的思路:不妨换一种思路。因为“lucky"数字中只有一位是不同的,而我们会想“lucky”数字真的很多吗?

其实并不多,我们是不是可以枚举哪一位不同呢?

进一步来说,我们可以枚举“lucky"数字的位数,哪一位不同,不同的数字是几,相同的数字是几。

把枚举出来的“lucky”数比较一下是否在a,b的范围内不就完事了吗?

  • 写回答

3条回答 默认 最新

  • a5156520 2024-12-16 21:01
    关注

    可以定义一个函数来判断一个整数是否“lucky”数,在函数中可以依次提取这个整数的每一位,并计算每一个出现的整数的次数,如果满足“lucky”数的条件,则返回1,如果不满足,则返回0。

    一个实现,如下:

    #include <stdio.h>
    
    // 定义函数findLuckyNum(),判断参数num是否是“lucky”数,如果是的返回1,如果不是返回0 
    int findLuckyNum(long long num){
        
        int i,nums[10]={0},temp,one=0,more=0;
        
        // 如果要判断负整数,则可以加个判断,先将其转为对应的正整数
    //    if(num<0){
    //        num=-num;
    //    } 
    //     
        if(num==0){
            nums[0]++;
        }
        
        while(num>0){
            temp=num%10;
            nums[temp]++;
            num/=10;
        } 
        
        for(i=0;i<10;i++){
            
            if(nums[i]==1){
                one++;
            }
            
            if(nums[i]>1){
                more++;
            }
            
        }
        
        if(one==1&&more==1){
            return 1;
        }else{
            return 0;
        }
        
    }
    
    int main(void){
        
        long long a,b,nums=0,i;
    
        scanf("%lld%lld",&a,&b);  // 从输入获取a和b的值 
        
        // 遍历区间a和b之间的每个整数,计算其中有多少“lucky”数 
        for(i=a;i<=b;i++){
            
            if(findLuckyNum(i)==1){
                nums++;
    //            printf("%lld\n",i);
    //            
    //            if(nums%50==0){
    //                getchar();
    //            }
            }
            
        }
        
        printf("%lld",nums);  // 打印结果 
        
        return 0;
        
    }
    
    

    img

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 12月16日