蓝桥杯——2013年C++A组第2题:排它平方数【枚举】

一、题目

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

    原来,203879 * 203879 = 41566646641

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

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

    再归纳一下筛选要求:
    1. 6位正整数
    2. 每个数位上的数字不同
    3. 其平方数的每个数位不含原数字的任何组成数位

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

请通过浏览器提交答案。
注意:只提交另一6位数,题中已经给出的这个不要提交。
注意:不要书写其它的内容(比如:说明性的文字)。

二、思路

直接暴力枚举,要注意数据类型要用longlong,不然会越界。

其次,因为每个数字要不一样,所以循环范围是123456-987654

有两个判断函数,第一个函数judge1是判断六位数字每个数位上有没有重复的数字,第二个函数judge2是用来判断11为数字i*i 上面每个数位有没有重复的数字

三、题解

#include <iostream>
using namespace std;
int vis[10];

int judge(long long a)
{
    while(a)
    {
        if(vis[a%10]==0)
        {
            vis[a%10]++;
            a /= 10;
        }
        else 
            return 0;
    }
    return 1;
}
int judge2(long long b)
{
    while(b)
    {
        if(vis[b%10]!=0) 
            return 0;
        b /= 10;
    }
    return 1;
}
int main()
{
    for(long long i = 123456;i<=987654;i++)
    {
        memset(vis,0,sizeof(vis));
        if(judge(i)&&judge2(i*i))
        {
            cout<<i<<" "<<i*i<<endl;
        }
    }
    return 0 ;
}

看到还有一种方法,但是没看懂,有小伙伴会的教教:


#include<iostream>
using namespace std;
 
int main()
{
	int num[10],flag;
	for(long long i=123456;i<=987654;i++)
	{
		long long a=i;
		long long b=i*i;
		memset(num,0,sizeof(num));
		flag=1;
		while(a)
		{
			if(num[a%10])
			{
				flag=0;
				break;
			}
			num[a%10]++;
			a/=10;
		}
		if(flag)
		{
			while(b)
			{
				if(num[b%10])
				{
					flag=0;
					break;
				}
				b/=10;
			}
			if(flag)
				cout<<i<<endl;
		}
	}
	return 0;
}

四、结果

发布了57 篇原创文章 · 获赞 9 · 访问量 3589

猜你喜欢

转载自blog.csdn.net/Jayphone17/article/details/104226470