[蓝桥杯2015初赛]奇妙的数字

奇妙的数字


题目描述

小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。你能猜出这个数字是多少吗?


输出

请输出该数字,不要输出任何多余的内容。


代码

解法一

刚刚好才学过全排列没几天,所以看到题目第一反应就是用全排列,代码如下:

#include <bits/stdc++.h>
#define ll long long
using namespace std;

void check(int a[]){//判断函数
    int t1=a[0]*1000+a[1]*100+a[2]*10+a[3];
    int t2=a[4]*100000+a[5]*10000+a[6]*1000+a[7]*100+a[8]*10+a[9];
    int t=sqrt(t1);
    if(t*t!=t1){//注意,如果没有这一句的话,会多输出两个73
        return;
    }
    if(t*t*t==t2){
        printf("%d\n",t);
    }

}

void perm(int a[],int k,int n){//全排列函数
    if(k==n){
        check(a);
    }
    else{
        int t;
        for(int i=n;i>=k;i--){
            {t=a[k];a[k]=a[i];a[i]=t;}
            perm(a,k+1,n);
            {t=a[k];a[k]=a[i];a[i]=t;}
        }
    }
}
int main(){
    int a[10]={0,1,2,3,4,5,6,7,8,9};
    perm(a,0,9);
    return 0;
}

解法二:

用set容器,因为set内部存储的数据都不相同,所以可以利用这一点,当set容器长度刚好为10时,证明刚好用完0~9十个数。代码如下:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
 
int main(){
    set<int> a;
    int t1,t2;
    int t;
    for(int i=10;i<100;i++){
        t1=i*i;
        while(t1>0){
            t=t1%10;
            a.insert(t);
            t1/=10;
        }
        t2=i*i*i;
        while(t2>0){
            t=t2%10;
            a.insert(t);
            t2/=10;
        }
        if(a.size()==10){
            printf("%d\n",i);
        }
        a.clear();
        //printf("%d ",i);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值