目前主要分为三个专栏,后续还会添加:
感谢阅读!
初来乍到,如有错误请指出,感谢!
描述
变种水仙花数 - 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语言标准中,%
运算符的行为由实现定义,但大多数编译器都遵循上述规则。需要注意的是,使用 %
运算符时,左操作数和右操作数都必须是整型(int
、long
等),且右操作数不能为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语言中的 %
运算符通常被称为取模运算符,但它实际上执行的是取余操作。