#include <stdio.h>
// (1) 反转魔法:反转数字(自动忽略前导零)
int reverse(int n) {
int rev = 0;
while (n > 0) {
rev = rev * 10 + n % 10;
n /= 10;
}
return rev;
}
// (2) 平方和魔法:各位数字平方和
int squareSum(int n) {
int sum = 0;
while (n > 0) {
int digit = n % 10;
sum += digit * digit;
n /= 10;
}
return sum;
}
// (3) 幸运检测:能被7整除 或 个位是7
int isLucky(int n) {
return (n % 7 == 0) || (n % 10 == 7);
}
// (4) 主变换函数:展示所有魔法效果 + 快乐数字判断
void transformNumber(int n) {
if (n <= 0) {
printf("请输入正整数!\n");
return;
}
printf("=== 神奇数字变换器 ===\n");
printf("原始数字:%d\n\n", n);
// 反转魔法
printf("1. 反转魔法:%d → %d\n", n, reverse(n));
// 平方和魔法(第一次)
int sq = squareSum(n);
printf("2. 平方和魔法:%d → %d\n", n, sq);
// 幸运检测
printf("3. 幸运检测:%d %s幸运数字\n\n", n, isLucky(n) ? "是" : "不是");
// 持续平方和 → 判断是否快乐数字
printf("4. 快乐数字检测过程:\n %d", n);
int temp = n;
int seen[10000] = {0}; // 检测循环(足够大)
while (temp != 1 && temp != 4) {
if (seen[temp]) { // 出现重复 → 一定不是快乐数字
printf(" → [循环检测到] → 不是快乐数字!\n");
return;
}
seen[temp] = 1;
temp = squareSum(temp);
printf(" → %d", temp);
}
printf("\n");
if (temp == 1) {
printf("最终结果:%d 是快乐数字!(变成1)\n", n);
} else {
printf("最终结果:%d 不是快乐数字!(陷入4的循环)\n", n);
}
}
// 主函数:测试多个经典例子
int main() {
int tests[] = {1, 7, 10, 13, 19, 4, 2, 68, 100, 999, 17, 44};
for (int i = 0; i < 12; i++) {
transformNumber(tests[i]);
printf("\n" "============================\n\n");
}
// 也可以手动输入
// int x;
// printf("请输入一个正整数:");
// scanf("%d", &x);
// transformNumber(x);
return 0;
}
#include <stdio.h>
int main() {
int magic[3][3];
printf("请输入3×3魔法阵的9个数字(空格或回车分隔):\n");
for (int i = 0; i < 9; i++) {
scanf("%d", &magic[0][i]); // 连续输入9个数,自动填满
}
// 将二维数组首地址赋给指针,开启指针魔法
int (*p)[3] = magic; // 指向整行的一维数组指针
printf("\n原始魔法阵:\n");
for (int i = 0; i < 3; i++) {
printf("%d %d %d\n", p[i][0], p[i][1], p[i][2]);
}
/* ================================
(1)指针旋转魔法:顺时针90度
不能使用 a[i][j],只能用指针!
================================ */
int temp[3][3];
int (*tmp)[3] = temp;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
*(*(tmp + j) + (2 - i)) = *(*(p + i) + j); // 核心指针旋转公式
}
}
// 把临时阵复制回原魔法阵
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
*(*(p + i) + j) = *(*(tmp + i) + j);
}
}
printf("\n顺时针旋转90度后:\n");
for (int i = 0; i < 3; i++) {
printf("%d %d %d\n", *(*(p + i) + 0), *(*(p + i) + 1), *(*(p + i) + 2));
}
/* ================================
(2)对角线交换魔法
用指针直接交换主对角线与副对角线上的元素
================================ */
// 主对角线:(0,0) (1,1) (2,2)
// 副对角线:(0,2) (1,1) (2,0) 注意中心5交换给自己,无需动
// 交换 (0,0) <-> (0,2)
int t1 = *(*(p + 0) + 0);
*(*(p + 0) + 0) = *(*(p + 0) + 2);
*(*(p + 0) + 2) = t1;
// 交换 (2,0) <-> (2,2)
int t2 = *(*(p + 2) + 0);
*(*(p + 2) + 0) = *(*(p + 2) + 2);
*(*(p + 2) + 2) = t2;
// 中心元素不动
printf("\n对角线交换魔法完成!\n");
printf("最终魔法阵:\n");
for (int i = 0; i < 3; i++) {
printf("%d %d %d\n", *(*(p + i) + 0), *(*(p + i) + 1), *(*(p + i) + 2));
}
return 0;
}