我懂你的心(C语言与魔术的结合之神奇的五位数)
有一次上网无意中刷到了一位魔术师的表演视频,觉得饶有趣味。于是想用代码来实现一下。
我们可以先看一下过程
所以最核心的部分,也是魔术的原理,就是怎样推出观众选的数字。我们不妨举一个例子
知道了过程,要推出观众心里选的数就不难了,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中运行示例