填数字玩游戏——穷举法演示

本文深入探讨了在给定五个有效数字的情况下,如何通过四种运算符(加、减、乘、除)组合来匹配指定结果的算法实现过程。详细介绍了循环嵌套结构、运算符优先级处理及条件判断的运用,旨在解决复杂运算与结果匹配的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




# include <stdio.h>
int main()
{
	int i1,i2,i3,i4,i5;
	int num1,num2;
	for(i1=1;i1<=9;i1++)
	{
		for(i2=0;i2<=9;i2++)
		{
			for(i3=0;i3<=9;i3++)
			{
				for(int i4=0;i4<=9;i4++)
				{
					for(int i5=0;i5<=9;i5++)
					{
						num1 = i5*1+i4*10+i3*100+i2*1000+i1*10000;
						num2 = i5*1+i5*10+i5*100+i5*1000+i5*10000+i5*100000;
						if(num1*i1==num2)
						{
							printf("   %d %d %d %d %d\n",i1,i2,i3,i4,i5);
							printf("X          %d\n",i1);
							printf("—————————\n");
							printf(" %d %d %d %d %d %d\n",i5,i5,i5,i5,i5,i5);
						}
					}
				}
			}
		}
	}
	printf("\n");
	return 0;
}
2,填运算符


# include <stdio.h>
int main()
{
	int i[5],j;//i存+-*/(4个有效运算符),循环变量、
	int sign;//运算累加时的符号(代表下一个运算符)
	int count =0;//累加器,统计符合条件的方案;
	int num[6];//保存5个有效数字
	int result;//最终结果
	float left,right;//保存中间结果
	char oper[5]={' ','+','-','*','/'};
	printf("请输入5个数:\n");
	for(j=1;j<=5;j++)
	{
		scanf("%d",&num[j]);
	}
	printf("请输入结果:\n");
	scanf("%d",&result);
	//循环4种运算符,1表示+,2表示-,3表示*,4表示/ i[1],表示第一个运算符
	for(i[1]=1;i[1]<=4;i[1]++)
	{
		if(i[1]<4 || num[2]!=0)
		{
			//该运算符不能为/,或者第2个数不能为0.即不能出现 /0的情况
			for(i[2]=1;i[2]<=4;i[2]++) //i[2]表示第2个运算符
			{
				if(i[2]<4 || num[3]!=0)
				{
					for(i[3]=1;i[3]<=4;i[3]++)//i[3]表示第3个运算符
					{
						if(i[3]<4 || num[4]!=0)
						{
							for(i[4]=1;i[4]<=4;i[4]++)//i[4]表示第4个运算符
							{	
								if(i[4]<4 || num[5]!=0)
								{
									left = 0;//将最左边的第一位数字设置为0
									right= num[1];//将第一位有效数字赋值给right
									sign = 1;
									//计算出left 和 right值
									for(j=1;j<=4;j++)
									{
										switch(oper[i[j]])
										{
											case '+':
											left = left+right*sign;//因为+-的级别低于*/,所以本次运算结束		
											sign = 1;//下一次运算+号,则为正,若下下次运算符依然为+-,则下次运算+-	
											right= num[j+1];//运算结束,指针后移 
											break;

											case '-':
											left = left+right*sign;//因为+-的级别低于*/,所以本次运算结束
											sign = -1;//下一次运算-号,则为负,若下下次运算符依然为+-,则下次运算+-	
											right= num[j+1];//运算结束,指针后移 
											break;

											case '*':
											right = right*num[j+1];//*/的优先级高于+-,所以本次运算*
											break;

											case '/':
											right = right/num[j+1];
											break;
											
	
										}
									}
									//统计结果
									//结果分析:若程序中存在+-号,则最终将运算加减号,若不存在+-号,则将等式左边的两数去和
									if(left+right*sign ==result)
									{
										count++;//统计结果+1
										printf("%3d: ",count);
										for(j=1;j<=4;j++)
										{	
											//i值根据外循环次数确定,j根据本次循环确定
											printf("%d %c",num[j],oper[i[j]]);
										}

										printf("%d = %d\n",num[5],result);
										
									}
									


								
								}
							
							}
						}
					}
				}
			}
		}
	}

	if(count==0)
	{
		printf("无结果满足要求!");
	}else{
		printf("总结果:%3d: \n",count);
	}

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值