华科万维C++期中练习3_5

穷举方程数独算法(20分)

题目内容:如下

bf70116198dd47bca2e4cd6e33f9e208.png

逻辑要点一共有三个:

1.满足等式;

2.数独;

3.尽可能缩小暴力穷举范围 

代码量:

有点大。

代码如下:


#include <iostream>
using namespace std;
int main()
{
        int ei;
        cout<<"请输入要查询的等式编号ei(ei>=1):";
        cin>>ei;
        /**********Program**********/
		int i,j,k;
		int b[10]={0},c[3];
		int i0,j0;
		int flag=0;
		int sum=0;
		for(i=102;i<=493;i++)//第一个数的范围取第三个数最大值的一半(取小)
		{
			for(j=i+1;j<=987;j++)//和第三个数k的范围保持一致
//第三个数k(也就是和)最大为987(数独)
			{
				k=i+j;
				if(k>987)break;//爆表直接打破循环
				int a[3]={i,j,k};//初筛通过,则存好三个数,便于后面非常妙地判断数独
				for(i0=0;i0<3;i0++)
				do
				{
					b[a[i0]%10]=1;
					a[i0]/=10;
				}while(a[i0]!=0);
            //把三个数的各位数逐一检索,一经发现使用,赋1,存到c数组里面
					for(j0=0;j0<10;j0++)
					{
						sum+=b[j0];
						b[j0]=0;
					}
					if(sum==9)//sum为9,说明九个不同的数填了九个坑
					{
						flag++;//标记自增,记录位置
						if(flag==ei)
						{
							c[0]=i;
							c[1]=j;
							c[2]=k;
						}//如果位置正好是目标,存起来,便于输出
					}
					sum=0;
			}
			}
		if(ei>flag)
		{
			cout<<"一共可生成"<<flag<<"个满足条件的等式"<<endl;
			cout<<"第"<<ei<<"个等式不存在"<<endl;
		}
		else
		{
			cout<<"一共可生成"<<flag<<"个满足条件的等式"<<endl;
	        cout<<"第"<<ei<<"个等式"<<c[0]<<"+"<<c[1]<<"="<<c[2]<<endl;
		}
        /**********  End  **********/
        return 0;
}

 输入样例:

  1. 56
  2. 7
  3. 9
  4. 123
  5. 1
  6. 554
  7. 2
  8. 3
  9. 200
  10. 17
  11. 790
  12. 345
  13. 555
  14. 29
  15. 90
  16. 11
  17. 400
  18. 240
  19. 123
  20. 106

输出样例:

一共可生成544个满足条件的等式

第56个等式109+754=863

一共可生成544个满足条件的等式

第7个等式104+579=683

一共可生成544个满足条件的等式

第9个等式105+269=374

一共可生成544个满足条件的等式

第123个等式142+695=837

一共可生成544个满足条件的等式

第1个等式103+469=572

一共可生成544个满足条件的等式

第554个等式不存在

一共可生成544个满足条件的等式

第2个等式103+479=582

一共可生成544个满足条件的等式

第3个等式103+579=682

一共可生成544个满足条件的等式

第200个等式169+403=572

一共可生成544个满足条件的等式

第17个等式106+487=593

一共可生成544个满足条件的等式

第790个等式不存在

一共可生成544个满足条件的等式

第345个等式249+358=607

一共可生成544个满足条件的等式

第555个等式不存在

一共可生成544个满足条件的等式

第29个等式108+359=467

一共可生成544个满足条件的等式

第90个等式129+735=864

一共可生成544个满足条件的等式

第11个等式105+387=492

一共可生成544个满足条件的等式

第400个等式284+391=675

一共可生成544个满足条件的等式

第240个等式183+526=709

一共可生成544个满足条件的等式

第123个等式142+695=837

一共可生成544个满足条件的等式

第106个等式137+268=405 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值