神奇数字代码

#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;
}

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部