找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 491|回复: 4

排它平方数

[复制链接]

205

主题

173

回帖

6925

积分

论坛元老

积分
6925
发表于 2013-5-27 19:04:52 | 显示全部楼层 |阅读模式
    小明正看着 203879 这个数字发呆。

    原来,203879 * 203879 = 41566646641

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

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

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

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

14

主题

65

回帖

0

积分

新手上路

积分
0
发表于 2013-5-27 19:28:37 | 显示全部楼层
#include <stdio.h>
#include <stdarg.h>

// 定义BOOL类型
typedef enum
{
    FALSE = 0,
    TRUE  = 1
}BOOL;

// 定义64位整数类型
#ifdef _WIN32
typedef __int64 INT64;
#else
typedef long long INT64;
#endif

/**************************************************************************
* - 名称: isAllDiff
* - 功能: 判断数字x是否与其他数都不相同
* - 入参: x - 待判断的数字
*         count - 需要与x比较的数字的个数
* - 出参: 无
* - 返回: BOOL
* - 备注: 无                       
**************************************************************************/
BOOL isAllDiff(int x, int count, ...)
{
    va_list args;
    int i = 0;
   
    va_start(args, count);
    for (i = 0; i < count; ++i)
    {
        if (x == va_arg(args, int)) // 发现有相同直接返回
        {
            va_end(args);
            return FALSE;
        }
    }

    va_end(args);
    return TRUE; // x与其他数字均不相同
}

/**************************************************************************
* - 名称: checkSquare
* - 功能: 检查平方数是否满足排他性
* - 入参: square - 平方数
*         abcdef - 原数的各位
* - 出参: 无
* - 返回: BOOL
* - 备注: 无                       
**************************************************************************/
BOOL checkSquare(INT64 square, int a, int b, int c, int d, int e, int f)
{
    int digit = 0;
   
    while (0 < square)
    {
        digit = (int)(square % 10);
        if (!isAllDiff(digit, 6, a, b, c, d, e, f))
        {
            return FALSE;
        }
        
        square /= 10;
    }
   
    return TRUE;
}

int main()
{
    int a, b, c, d, e, f;   // 代表6位数abcdef
    int number = 0;         // 由abcdef组成的6位数
    INT64 square = 0;       // 6位数number的平方
   
    for (a = 9; a > 0; a--)
    {
        for (b = 9; b >= 0; b--)
        {
            if (!isAllDiff(b, 1, a))
            {
                continue;
            }
            for (c = 9; c >= 0; c--)
            {
                if (!isAllDiff(c, 2, a, b))
                {
                    continue;
                }
                for (d = 9; d >= 0; d--)
                {
                    if (!isAllDiff(d, 3, a, b, c))
                    {
                        continue;
                    }
                    for (e = 9; e >= 0; e--)
                    {
                        if (!isAllDiff(e, 4, a, b, c, d))
                        {
                            continue;
                        }
                        for (f = 9; f > 0; f--)
                        {
                            if (!isAllDiff(f, 5, a, b, c, d, e))
                            {
                                continue;
                            }

                            // 个位为1或5或6的数不满足排他性
                            if (1 == f || 5 == f || 6 == f)
                            {
                                continue;
                            }
                           
                            number = f + e * 10 + d * 100 + c * 1000 + b * 10000 + a * 100000;
                            square = (INT64)number * (INT64)number;
                           
                            if (checkSquare(square, a, b, c, d, e, f) && 203879 != number)
                            {
                                printf("%d\n", number);
                                
                                return 0;
                            }
                        }
                    }
                }
            }
        }
    }
   
    printf("can not find the number.\n"); // 没有找到满足条件的数字
   
    return 0;
}

0

主题

2

回帖

0

积分

新手上路

积分
0
发表于 2013-5-27 19:43:13 | 显示全部楼层
跟你这一比较, 我发自己 真是井底之蛙  ,

205

主题

173

回帖

6925

积分

论坛元老

积分
6925
 楼主| 发表于 2013-5-29 21:02:52 | 显示全部楼层

回 boyfaceone 的帖子

boyfaceone:#include <stdio.h>
#include <stdarg.h>

// 定义BOOL类型
typedef enum
.......&#160;(2013-05-27 19:28)&#160;
代码量稍多,但效率上应该是算可以的,可以试着简化下代码量

0

主题

38

回帖

0

积分

版主

积分
0
发表于 2013-6-1 23:42:25 | 显示全部楼层
在组合数字的时候,不用那么麻烦的排列,判断有没有重复的数字,
直接 C(10,6)  直接组合,首位特殊处理就行了,就是0-9 10个数字取出6个进行排列.
排他平方数只是不同进制中的不同特例,二进制没有,8进制,16进制中的排他平方数也不同.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 15:17 , Processed in 0.073221 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表