我懂你的心(C语言与魔术的结合之神奇的五位数)

我懂你的心(C语言与魔术的结合之神奇的五位数)

有一次上网无意中刷到了一位魔术师的表演视频,觉得饶有趣味。于是想用代码来实现一下。
我们可以先看一下过程

打乱这五个数字的顺序
前一个五位数减去后一个五位数
每一位不相同的五位数
小于前一个数的五位数
结果
观众选一位最喜欢的数字
表演者推出
结果
观众最喜欢的数字
剩下的其他的数字

所以最核心的部分,也是魔术的原理,就是怎样推出观众选的数字。我们不妨举一个例子

打乱这五个数字的顺序
前一个五位数减去后一个五位数
54321
21345
32976
观众选一位最喜欢的数字
将每位数相加
大于10,则再拆开来相加
小于10,则用9减去它
32976
3
2976
24
6

知道了过程,要推出观众心里选的数就不难了,C语言实现也同样简单

	n[0] = p / 1000;
        n[1] = p /100 - n[0] *10;
        n[2] = p /10 - n[0] * 100 - n[1] * 10;
        n[3] = p %10;
        j = n[0] + n[1] + n[2] + n[3];
        if(j > 10)
        {
            m1 = j / 10;
            m2 = j % 10;
            k = 9 - (m1 + m2);
        }
        else if(j < 10)
        {
            k = 9 -j;
        }

看到这,你是不是想赶紧找人秀一波呢?呵呵,别急!
通过大量的验证后,我依然发现这个魔术还是有点问题。比如96542-65249=31293如果观众给我们的不喜欢的数字是3123,则推出来的数字是0,显然与观众喜欢的9不符。于是我后来加了一条判断语句

if(k == 0)
{
    k = 9;
}

但发现还是有问题,比如98563-89563=9000如果观众给我们的不喜欢的数字是900,则推出来的数字是9,又与观众喜欢的0不符。

在这里插入图片描述
最后只能想一个折中的方案,判断观众喜欢的数字是0或9。
在这里插入图片描述
最后为了增加程序的可玩性,自然要加点前戏啦,再来点交互就完美了!
下面是完整的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int n[4] = {0};
    int j = 0, m1, m2, k, p;
    char q[10];
    printf("信不信我明白你心里想什么?               信/不信\n");
    printf("请输入:");
    scanf("%s", q);
    while(strcmp(q, "信") != 0 && strcmp(q, "不信") != 0)
    {
        printf("请正确输入,谢谢\n");
        printf("请输入:");
        scanf("%s",q);
    }
    if (strcmp(q, "信") == 0)
    {
        printf("我就知道你会信的!\n");
        goto end;
    }
    else if(strcmp(q, "不信") == 0)
    {
        printf("不信的话来玩个游戏吧!                   好/不好\n");
    }
    printf("请输入:");
    scanf("%s", q);
    while(strcmp(q, "好") != 0 && strcmp(q, "不好") != 0)
    {
        printf("请正确输入,谢谢\n");
        printf("请输入:");
        scanf("%s",q);
    }
    if (strcmp(q, "好") == 0)
    {
        printf("嗯好,请你先在纸上写下一个五位数,要保证每一位不相同哦!    (完成后请按回车)");
        getchar();
        getchar();
        printf("接下来要打乱这五个数字的顺序组成一个小于前一个数的五位数哦!");
        getchar();
        printf("之后呢,用前一个五位数减去后一个数(怕算错数可以用计算器呀!)");
        getchar();
        printf("得到的结果中选一个你最喜欢的数字,不喜欢的其他数字告诉我吧!");
        getchar();
        printf("你不喜欢的数字是:");
        scanf("%d", &p);
        while(p >= 10000)
        {
            printf("请正确输入,谢谢\n");
            printf("请输入:");
            scanf("%d",&p);
        }
        n[0] = p / 1000;
        n[1] = p /100 - n[0] *10;
        n[2] = p /10 - n[0] * 100 - n[1] * 10;
        n[3] = p %10;
        j = n[0] + n[1] + n[2] + n[3];
        if(j > 10)
        {
            m1 = j / 10;
            m2 = j % 10;
            k = 9 - (m1 + m2);
        }
        else if(j < 10)
        {
            k = 9 -j;
        }
        if(k == 0)
        {
            printf("哈哈,我知道你最喜欢的数字是%d或%d\n", k, k + 9);
        }
        if(k != 0)
        {
            printf("哈哈,我知道你最喜欢的数字是%d\n",k);
        }
    }
    else if(strcmp(q, "不好") == 0)
    {
        printf("不玩就算了,再见!\n");
    }
    end:
    return 0;
}

codeblocks中运行示例
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值