鬼谷子猜数问题 - 高三毕业以前最后一篇日志

这篇博客记录了一位高三毕业生在毕业前的最后一篇日志中,分享了他解决鬼谷子猜数问题的过程。通过编写程序,展示了其编程技能和逻辑思维能力。
部署运行你感兴趣的模型镜像
  2012.7.22 21:30
  高三前暑假的倒数第二天,高中很忙,基本没看程序,电脑有关的内容了,所以日志更新的很慢,或者说是非常慢?这篇怕是高三毕业以前的最后一篇日志了,希望一年过后的高考能勇夺桂冠,到了大学,就算忙也可以照顾到自己的兴趣了吧。这个问题是远在美国的堂哥发来的,说很有意思让我试试。说实话,对我来讲,算法着实花了不少时间想,而且可能因为很久没写程序,写完后也改动了很多
  直接切入正题:

  问题:一天,鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了庞涓,
把这两个数的乘积告诉了孙膑。但孙膑和庞涓彼此不知到对方得到的数。第二天,
庞涓很有自信的对孙膑说:虽然我不知到这两个数是什麽,但我知道你一定也不知
道。随后,孙膑说:我知道了。庞涓说:我也知道了。请问:这两个数是什么?

  分析:如下图,

  为了简化,庞涓定为A,也就是知道两数和的,孙膑为B,也就是知道两数积的。线索及从线索出导出的关系如下:
(1)A不知道是哪两个数 → 两数和可以推出至少两种x y组合(多解)
(2)A可以推出B也不知道是哪两个数 → 两数和的所有x y组合的乘积都有多解
(3)在知道(2)之后B立刻知道答案 → 在知道x y乘积的情况下只存在一个解满足(1) (2)条件 (即答案不在满足条件(1)(2)的所有x y组合中有多组乘积相同的解中。很好理解,若有两组x y乘积相同且都满足条件(1)(2)则B将他得到的乘积一比较将得到两组答案,无法直接得出题解)
(4)A在得知B推出答案后也得出答案 → 在知道x y和的情况下只存在一个解满足(1) (2) (3)条件(理由同上)


  算法步骤:
(1)在main函数中循环x+y的值sum从1→197穷举出x+y所有和的值
(2)将sum值送入f1函数穷举出所有x y的组合(x≠y)
(3)将每个穷举出的x y组合的乘积送入f2函数穷举出所有x y组合判断是否满足多解(即存在多个x y组合)
*若不满足多解则返回到(1)使sum值+1重新送入f1循环直至197
(4)若满足多解则f2函数返回至f1返回到main函数中将x y组合送入f4函数将x y值写入到数组x1与y1中(x1与y1数组的长度是第一次不通过f4函数写入直接将所有x y组合输出到屏幕上估算出的组数,也可以不这样做,总共也就A 2 97 = 4656种,无非有点大)如此循环到sum到197后将所有满足条件的x y组合都写入到数组x1 y1中了
(5)f5函数将数组中乘积相等的x y组合从数组中删掉,之后再将剩余的组合中和相等的x y组合删去,此时只剩下一组数据,即题解
(6)f6函数搜索数组x1 y1中不为零的变量(即题解),并将其输出。

程序如下:

#include <stdio.h>
#include <conio.h>

int x1[200]={0};
int y1[200]={0};
int sum1[200]={0};
int p1[200]={0};
int h=0;

void f6() //输出数组x1,y1中非零部分(即题解)
{
	int i;
	for(i=1;i<=200;i++)
	{
		if(x1[i]!=0)
		{
			printf("x=%d y=%d\n",x1[i],y1[i]);
		}
	}
}

void f5() //删除掉乘积相等的xy组合后再删除掉和相等的组合
{
	//删除掉积相等的xy组合
	int i,n,g; //g为指示值
	for(i=1;i<=200;i++)
	{
		for(n=i+1;n<=200;n++)
		{
			if(p1[i]==p1[n] && p1[i]!=0) //用第i组积从第i+1开始比较一直到200
			{
				g=1;//g值为1表示在第i组后存在一组n的乘积与之相等
				x1[n]=0,y1[n]=0,sum1[n]=0,p1[n]=0; //删掉第i组后所有积与第i组积相同的xy组合
			}
		}
		if(g==1)
		{
			x1[i]=0,y1[i]=0,sum1[i]=0,p1[i]=0; //删掉第i组数据
			g=0;//复位
		}
	}

	//删掉和相同的组合,原理同上
	for(i=1;i<=200;i++)
	{
		for(n=i+1;n<=200;n++)
		{
			if(sum1[i]==sum1[n] && sum1[i]!=0)
			{
				g=1;
				x1[n]=0,y1[n]=0,sum1[n]=0,p1[n]=0;
			}
		}
		if(g==1)
		{
			x1[i]=0,y1[i]=0,sum1[i]=0,p1[i]=0;
			g=0;
		}
	}
}

int f4(int sum) //输入函数,输入x+y,向x1 y1数组写入所有x,y组合,在f1判断完后
{
	int x,y; 
	for(x=2;x<=99;x++)
	{
		for(y=x+1;y<=99;y++)
		{
			if(x+y==sum)
			{
				h++; //之前定义的整形全局变量h意义在于可以依序向数组写入而不会因为f4函数本身的循环执行而丢失
				x1[h]=x;
				y1[h]=y;
				sum1[h]=x+y;
				p1[h]=x*y;
			}
		}
	}
}


int f2(int p) //p=x*y,函数功能为输入xy乘积穷举所有x,y并判断是否满足多解(返回值1)
{
	int m,n,i=0; //i为记数变量
	for(m=2;m<=99;m++)
	{
		for(n=m+1;n<=99;n++)
		{
			if(m*n==p && m!=n)
				i++;
		}
	}
	if(i>1) return 1;
	else return 0;
}


int f1(int sum) //记数函数,输入x+y,穷举所有x,y组合并送入f2中判断
{
	int x,y;
	for(x=2;x<=99;x++)
	{
		for(y=x+1;y<=99;y++)
		{
			if(x+y==sum)
			{
				if (f2(x*y)!=1)
				{
					return 0;
				}
			}
		}
	}
	return 1;
}


int main()
{
	int sum;
	for(sum=7;sum<=197;sum++)
	{
		if(f1(sum)==1)
			f4(sum);
	}
	f5();
	f6();
	return 0;

}

运行截图:


您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值