效果
3或者大于3位数 每一位的位数次方相加等于 自身
例如
153
1^3^ + 5^3^ + 3^3^ 结果为1+125+27 =153
1634:
- 计算过程:
- 14+64+34+44=1+1296+81+256=16341^4 + 6^4 + 3^4 + 4^4 = 1 + 1296 + 81 + 256 = 163414+64+34+44=1+1296+81+256=1634
过程
求得单独将所有位数的正数拎出来, 位次方后等于自身,打印
如何单拎出来所有位数?
11324
个位
直接模10
百/千/万
利用画个磨石刀方法
将其化为个位,然后模10
例如百位
11324/100 = 113
113 % 10 = 3 拿到百位数3
代码
写死位数
c
int i = 100;
do {
int a = i % 10;
int b = i / 10 % 10;
int c = i / 100;
if (pow(a,3) + pow(b, 3) + pow(c, 3) == i)
{
printf("%d\n", i);
}
i++;
} while (i <= 999);
用户指定几位的水仙花
c语言版本
c
int main()
{
int i;
printf("请输入位数(3-9):");
scanf_s("%d", &i);
if (i < 3 || i>9) {
printf("不能小于三,不能大于九\n");
return 0;
}
int start = pow(10, i - 1);
int end = pow(10, i) - 1;
// 动态分配数组
int* allNum = (int*)malloc(i * sizeof(int));
if (allNum == NULL) {
printf("内存分配失败\n");
return 1; // 退出程序
}
for (int j = start; j < end; j++)
{
int sum = 0;
for (int k = 0; k < i; k++)
{
allNum[k]=(j / (int)pow(10, k)) % 10;
}
for (int k = 0; k < i; k++)
{
sum += (int)pow(allNum[k], i);
}
if (sum == j) {
printf("找到水仙花了:%d\n", j);
}
}
}
java版本
java
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
if (i < 3 || i > 9) {
System.out.println("不能小于3,不能大于9");
return;
}
int start = (int) Math.pow(10, i - 1);
int end = (int) (Math.pow(10, i) - 1);
for (int j = start; j < end; j++) {
// 根据位数提取出每一位的数字,
int[] allNum = new int[i];
for (int k = 0; k < i; k++) {
// 第n位就除以10的n-1次方,因为个位数不需要除以10,乘以1-1=0 10的零次方, 除以1即可,但是我们这里是从0开始符合存储数据下标,不用减去了
allNum[k] = (int) ((j / Math.pow(10, k)) % 10);
}
// 收集好所有位数数据后依次位次方相加
int sum = 0;
for (int num : allNum) sum += (int) Math.pow(num, i);
if (sum == j) {
System.out.println("找到水仙花了:" + j);
}
}