每日一练

目录

1148:题目描述

按从小到大的顺序输出这三个三位数,由空格隔开。输出占一行。

答案:


1148:题目描述

把1、2、3、4、5、6、7、8、9组合成3个3位数,要求每个数字仅使用一次,使每个3位数均为完全平方数。按从小到大的顺序输出这三个三位数。

输入

输出

按从小到大的顺序输出这三个三位数,由空格隔开。输出占一行。

答案:

(代码错误,增加要求输出其中最大的三个数字,要求该三位数字1-9仅使用一次

#include<stdio.h>
int main()
{
	int x,y,z,m,n,a[13][3],b[9],j,k,p=0;
	for(x=1; x<10; x++)
		for(y=1; y<10; y++)
			for(z=1; z<10; z++)
				if(x!=y && x!=z && y!=z)
				{
					n=x*100+y*10+z;
					m=1;
					while (m*m<=n)
					{
						if (m*m==n)//从1开始,到平方和 >n结束      平方和=n为符合条件 的数字(n)
						{
							//找到所有符合条件的数字,存入数组a中
							a[p][0]=x;
							a[p][1]=y;
							a[p++][2]=z;
							printf("%d",a[p-1][0]);
							printf("%d",a[p-1][1]);
							printf("%d\n",a[p-1][2]);
						}
						m++;
					}
				}
	fx(p-1,1,a);
//	m=fx(p-1,1,a)/10;
//	n=fx(p-1,1,a)%10;
//	printf("\n\n%d%d%d\n",a[12][0],a[12][1],a[12][2]);
//	printf("%d%d%d\n",a[m][0],a[m][1],a[m][2]);
//	printf("%d%d%d\n",a[n][0],a[n][1],a[n][2]);
}
int fx(int p,int y,int a[13][3])
{
	int x,i,j,k,m,n,q=p,z=y;
	while(1)
	{
		x=0;
		for(i=0; i<3; i++)
			for(j=0; j<3; j++)
				if(a[p][i]!=a[p-y][j])
					x++;
		if(x==9)
			break;
		y++;
	}
	m=p-y;//第二大的不同数所在行数
	printf("%d",m);
	y=1;
	p=m;
	while(1)
	{
		x=0;
		for(i=0; i<3; i++)
			for(j=0; j<3; j++)
				if(a[p][i]!=a[p-y][j])
					x++;
		if(x==9)
		{
			k=0;
			for(i=0; i<3; i++)
				for(j=0; j<3; j++)
					if(a[q][i]!=a[p-y][j])
						k++;
			if(k==9)
				break;
		}
		y++;
	}
	n=p-y;//最后一个数字
	printf("%d\n",n);
	while(n<0)
	{
		fx(q,q-m+1,a);
		if(m<0)
			break;
	}
	while(m<0)
	{
		fx(--q,1,a);
		if(q<=0)
			break;
	}
	printf("\n%d%d",m,n);
	return m*10+n;
}

ps:

思路:先把数字存储到二维数组中,然后按行列比较是否相同

要最大的三个不同数字

倒着从最后一行开始(第12行)

锁定p=12(数组已经从小到大排序,第12行为最大的数字),和p-y比较(y=1),y++,寻找和p行完全不同的数字,记录行数(第二大的不同数字,记为第m行),然后再锁定m行,和m-y比较(y=1)最后寻找到和m,p行都不同的数字,记录为第n行。

如果n<0(该数不存在),则m向上移动一个,后重新寻找n(p不动)。

如果m<0(该数不存在),则p向上移动一个,然后重新寻找m和n。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值