| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 394 人关注过本帖
标题:苦恼的时间超限
只看楼主 加入收藏
未未来
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:182
专家分:157
注 册:2012-11-6
结帖率:94.87%
收藏
已结贴  问题点数:4 回复次数:2 
苦恼的时间超限
这是去年蓝桥杯的一个题,
小明正看着 203879 这个数字发呆。 原来,203879 * 203879 = 41566646641这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个,请你找出它!
再归纳一下筛选要求:
1. 6位正整数
2. 每个数位上的数字不同
3. 其平方数的每个数位不含原数字的任何组成数位
这是我写的,,
程序代码:
#include<iostream>
#include<string>
#include<sstream>
using namespace std;

 bool judge(string ss){

 for(int i=0;i!=ss.size();++i){
    for(int j=i+1;j!=ss.size();++j){
        if(ss[i]==ss[j])return 0;
    }

 }

 return 1;

 }

 bool judge2(string s1,string s2){
     for(int i=0;i!=s1.size();++i)
     {for(int j=0;j!=s2.size();++j){
            if(s1[i]==s2[j])
                return false;}
     }
     return true;

 }
bool doit(long long a)
{     ostringstream ostr;
       ostr<<a;
    string s;

 istringstream istr(ostr.str());

 istr>>s;
    if(!judge(s)) return 0;
    else{
        long long a2=a*a;
       ostringstream ostr1;
       ostr1<<a2;
       string s2;

 istringstream istr1(ostr1.str());

 istr1>>s2;
   if(judge2(s,s2)&&a!=203879 )cout<<a;
    }}
int main()
{  long long a=100000;
   for(;a!=1000000;++a){

 doit(a);
   }
return 0;
}

能输出正确答案,但是OJ判题时间超限;请教怎么可以缩短呢,
搜索更多相关主题的帖子: color 正整数 
2013-12-12 00:13
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:4 
懒得自己写算法,就尽量用了C++标准库中的算法,随手这么一写,抛砖引玉吧
程序代码:
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    unsigned a[10]={ 0, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
    for( ; std::next_permutation(a+0,a+10); std::reverse(a+6,a+10) )
    {
        unsigned n = a[0]*100000+a[1]*10000+a[2]*1000+a[3]*100+a[4]*10+a[5]*1;
        unsigned rest_flag = 1u<<a[6] | 1u<<a[7] | 1u<<a[8] | 1u<<a[9];

        unsigned long long r = 1ull*n*n;
        for( ; r; r/=10 )
        {
            if( !( 1u<<(r%10) & rest_flag ) )
                break;
        }

        if( r == 0 )
            cout << n << endl;
    }

    return 0;
}

2013-12-12 09:34
未未来
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:182
专家分:157
注 册:2012-11-6
收藏
得分:0 
回复 2楼 rjsp
程序代码:
#include<iostream>
#include<string>
#include<sstream>
#include<ctime>
using namespace std;

 bool judge(int s[]){

 for(int i=0;i!=6;++i){
    for(int j=i+1;j!=6;++j){
        if(s[i]==s[j])return 0;
    }

 }

 return 1;

 }

 bool judge2(int s1[],int s2[],int k){
     for(int i=0;i!=6;++i)
     {for(int j=0;j!=k;++j){
            if(s1[i]==s2[j])
                return false;}
     }
     return true;

 }
int chuc(int s[],long long l){
int k=0;
while(l>0){
s[k++]=l%10;
l/=10;
}
return k;
}
int main()
{   clock_t start= clock();long long a=100000;
int s1[6],s2[100];
   for(;a!=1000000;++a){
   chuc(s1,a);

if(!judge(s1))continue;
else{
    long long a2=a*a;
int sizess=chuc(s2,a2);
if(judge2(s1,s2,sizess)&&a!=203879){

cout<<a<<endl;}
}

   }
clock_t en=clock();
cout<<float(en-start)/CLOCKS_PER_SEC;
return 0;
}

您那个好简单,但是看得不是很明白,,这是我修改过的,我起先的超限是不是因为用了
sstream的东西,版主
2013-12-12 14:13
快速回复:苦恼的时间超限
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027140 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved