牛客网刷题 | BC92 变种水仙花

目前主要分为三个专栏,后续还会添加:

        专栏如下:                 C语言刷题解析       C语言系列文章       我的成长经历

感谢阅读!

初来乍到,如有错误请指出,感谢!


描述

变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。

例如:

655 = 6 * 55 + 65 * 5

1461 = 1*461 + 14*61 + 146*1

求出 5位数中的所有 Lily Number。

输入描述:

输出描述:

一行,5位数中的所有 Lily Number,每两个数之间间隔一个空格。


解题思路 :

遍历所有5位数

最关键的是如何判断出是不是变种水仙花数

方案1 打印1-9 10-99 100-999 1000-9999

分别打印出来 然后进行 取模 判断*/

/*  又看错题目了 是5位数中所有的数字 不是1-5位数..........

这样就好办了 直接用除法和取模运算就可以了   */


理解题目要求:首先,彻底理解Lily Number的定义和题目要求。题目要求找出所有5位数中的Lily Number。

枚举所有5位数:由于题目要求找出5位数的Lily Number,你需要从10000枚举到99999,因为这是所有5位数的范围。

数字拆分:对于每一个枚举到的5位数,你需要考虑所有可能的拆分方式。对于一个5位数,有三种拆分方式:

将第一位数字拆分出来,剩下的四位作为一个数字。

将前两位数字拆分出来,剩下的三位作为一个数字。

将前三位数字拆分出来,剩下的两位作为一个数字。

计算乘积:对于每种拆分方式,计算两个部分的乘积。例如,如果一个数字是abcde,那么需要计算的乘积有:

a * bcde

ab * cde

abc * de

累加乘积:将上述步骤中计算出的所有乘积相加。

判断Lily Number:如果累加得到的乘积之和等于原始的5位数,那么这个数字就是一个Lily Number。

输出Lily Number:当找到一个Lily Number时,将其输出。根据题目要求,输出格式是每个Lily Number之间用空格隔开。

编写循环结构:在C语言中,使用循环结构(如for循环)来实现上述枚举和判断逻辑。

注意边界条件:在计算乘积时,要注意边界条件,比如当拆分出一个0时,需要特别处理,因为任何数与0相乘都是0。

优化:考虑是否有优化的空间,比如某些情况下可以提前结束循环,或者避免重复计算。

测试:在完成代码编写后,测试你的程序以确保它能够正确地找出所有的Lily Number。


 代码 1 :

/* 解题思路 : 遍历所有5位数
               最关键的是如何判断出是不是变种水仙花数
               方案1 打印1-9 10-99 100-999 1000-9999 
               分别打印出来 然后进行 取模 判断*/

/*又看错题目了 是5位数中所有的数字 不是1-5位数..........
这样就好办了 直接用除法和取模运算就可以了*/

# include <stdio.h>
int main ()

{
    for(int i=10000;i<=99999;i++)
    {
        int sum=(i/10000)*(i%10000)+(i/1000)*(i%1000)+(i/100)*(i%100)+(i/10)*(i%10);//存放数据
        
        if (sum==i) 
        {
            printf("%d ",i);
        }
    }

    return 0;
}

 代码 2 :

#include<stdio.h> // 引入标准输入输出库

int main() // 主函数的开始
{
    int i, j; // 定义两个整型变量i和j,用于循环计数

    // 从10000到99999枚举每一个5位数
    for(i = 10000; i < 99999; i++)
    {
        int sum = 0; // 初始化乘积之和为0

        // 从10开始,每次乘以10,直到10000,这样可以遍历所有可能的拆分
        for(j = 10; j <= 10000; j = 10 * j)
        {
            // 计算当前拆分的乘积:当前数字除以j得到的商乘以当前数字除以j得到的余数
            sum += (i / j) * (i % j); // 累加到sum中
        }

        // 如果所有拆分的乘积之和等于原数字,说明找到了一个Lily Number
        if (sum == i)
            printf("%d ", i); // 输出这个Lily Number
    }

    return 0; // 主函数返回0,表示程序正常结束
}

代码 3:

#include<stdio.h>
int main()
{
    int num=0;        //这是记录打印次数的,可能是题目写错了吧.没用上
    int x = 10000;    //从最小的五位数一万开始循环
    int a,b,c,d;
    while(x<=99999)    
    {
        a = (x/10000)*(x%10000);        // -a -b -c -d   -是五位数的四种经过拆分之后相乘得到的结果
        b = (x/1000)*(x%1000);
        c = (x/100)*(x%100);
        d = (x/10)*(x%10);
        if(x==a+b+c+d)        //打印符合条件的数字
        {
            printf("%d",x); 
            num++;                //记录的打印次数加1
           // if(num % 2 == 0)        //每打印两个数字加一个空格,但是审题不通过,注释过后正常通过, num 这个计数的变量没用
                printf(" ");
        }
        x++;
    }
}

知识点 :C语言中的取模和取余

取模(Modulus)

取模操作通常用于数学计算中,它返回除法的余数。

当两个数都是整数时,取模的结果也是整数。

例如,7 % 3 的结果是 1,因为 7 除以 3 的商是 2,余数是 1

 取模操作使用 % 运算符,它返回两个整数相除后的余数。这个余数的符号与被除数的符号相同。

代码示例

#include <stdio.h>

int main() {
    int a = 7;
    int b = 3;

    int mod = a % b; // 计算 7 % 3 的余数,结果为 1
    printf("The modulus of %d and %d is %d\n", a, b, mod);

    return 0;
}

取余(Remainder)

取余操作是取模操作的一个特例,它用于处理正数和负数的除法余数。

当除数是正数时,取余和取模的结果相同。

当除数是负数时,取余的结果与取模的结果不同。取余操作会返回一个正数余数,而取模操作会返回一个与被除数符号相同的余数。

例如,-7 % 3 的结果是 -1,因为取余操作保证了余数是正数。而 7 % -3 的结果也是 1,因为取模操作返回与被除数 7 符号相同的余数。

在C语言编程中,通常使用“取模”这个词来描述 % 运算符的操作,而不考虑除数的正负。但是,如果你在处理数学问题,特别是在讨论除法的余数时,区分取模和取余可能会更加精确。

在C语言标准中,% 运算符的行为由实现定义,但大多数编译器都遵循上述规则。需要注意的是,使用 % 运算符时,左操作数和右操作数都必须是整型(intlong 等),且右操作数不能为0,否则会导致运行时错误。

在C语言中,% 运算符通常被称为取模运算符,但根据数学定义,它实际上执行的是取余操作。取余操作返回的余数的符号与除数的符号相同,这与数学中的取余定义一致。

当除数为正数时,取余和取模的结果相同。当除数为负数时,取余操作会调整余数的符号,使其与除数的符号相同。

代码示例

#include <stdio.h>

int main() {
    int a = 7;
    int b = -3;

    int rem = a % b; // 计算 7 % -3 的余数,结果为 -1
    printf("The remainder of %d and %d is %d\n", a, b, rem);

    a = -7;
    b = 3;

    rem = a % b; // 计算 -7 % 3 的余数,结果为 2
    printf("The remainder of %d and %d is %d\n", a, b, rem);

    return 0;
}

注意事项

  • % 运算符要求操作数都是整数类型。
  • 右操作数(除数)不能为0,否则会导致未定义行为或运行时错误。
  • 在C语言中,% 运算符通常被称为取模运算符,但在数学上,它执行的是取余操作,因为余数的符号与除数的符号相同。

总结

在C语言中,% 运算符用于计算两个整数相除的余数。当除数为正数时,这个余数与数学中的取模结果相同。当除数为负数时,余数的符号会与除数的符号相同,这与数学中的取余定义一致。因此,虽然C语言中的 % 运算符通常被称为取模运算符,但它实际上执行的是取余操作。

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值