排它平方数

寻找特殊六位数的平方根

    小明正看着 203879 这个数字发呆。

 

    原来,203879 * 203879 = 41566646641

 

    这有什么神奇呢?仔细观察,203879是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。

 

    具有这样特点的6位数还有一个,请你找出它!

 

    再归纳一下筛选要求:

    1. 6位正整数

    2. 每个数位上的数字不同

    3. 其平方数的每个数位不含原数字的任何组成数位

 

答案是一个6位的正整数。

	//运用到了大数乘法原理
	#include<stdio.h>
	#define N 20
	int a[N]={0},re[2*N]={0};
	
	int place(){
		int i,j;
		for(i=0;i<6;i++)
			for(j=i+1;j<6;j++)
				if(a[i]==a[j])
					return 0;
		return 1;	
	}
	
	int main(){
		
		int i,j,k,temp,flag;
		
		for(k=100000;k<999999;k++){
			temp=k;
			for(i=0;i<6;i++){
				a[i]=temp%10;
				temp/=10;
			}
			if(!place())
				continue;
			for(i=0;i<2*N;i++)
				re[i]=0;
			for(i=0;i<6;i++){
				for(j=0,temp=0;j<6;j++){
					re[i+j]+=a[i]*a[j]+temp;
					temp=re[i+j]/10;
					re[i+j]%=10;
				}
				if(temp>0)
					re[i+j]+=temp;
			}
			i=2*N-1;
			while(re[i--]==0);
			temp=i+1;
			for(++i,flag=1;i>=0&&flag;i--)
				for(j=0;j<6;j++)
					if(a[j]==re[i]){
						flag=0;
						break;
					}
			if(flag)
				printf("%d\n",k);
		}
		
		return 0;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值