| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 587 人关注过本帖
标题:一道题,大家帮我看看,我觉得我的程序写得没错,为什么算不出来
只看楼主 加入收藏
vdestroyer
Rank: 2
等 级:论坛游民
帖 子:136
专家分:14
注 册:2009-1-7
结帖率:96.43%
收藏
已结贴  问题点数:20 回复次数:3 
一道题,大家帮我看看,我觉得我的程序写得没错,为什么算不出来
5940376182这个数,是个10位数,它的特点就是从数字0到9刚好每个都只出现了一次。如果把这个数从中间劈开,会分别成为两个5位数 59403 和 76182
这两个数的平方是:
59403^2 = 3528716409
76182^2 = 5803697124

新算出来的这两个数,还是一个具有从0到9刚好每个数字之出现一次的特点。
写程序找出所有像 5940376182这种特点的10位数。


下面是我的程序:
我的思路是,自己写一个函数,这个函数里分成三步,检验每一个10位数的特点。
检查每个10位数的时候,都用数组的下标来完成。

这个函数总共有3步:
1. 检查这个10位数本身是不是具有0到9不重复的特点。
2. 把这个10位数拆开,取前5位,检查这个5位数的平方。
3. 取后5位,检查后5位的平方。

如果这三部都符合要求,那最终函数会返回1。
程序就会输出我想要的结果了。

#include <stdio.h>
#include <conio.h>

int check(long long n)
{
   
    int temp1[10]={0};
    int temp2[10]={0};
    int temp3[10]={0};
   
    /*
    int i;
    printf("In the checking function: \n");
    printf("The value of temp1:\n");
    for(i=0;i<10;i++)
        printf("%d:  %s\n",i,temp1[i]);
    */
    long long del;
   

    for(;n;n/=10)
        if(++temp1[n%10] > 1)
            return 0;
            
    del = (n / 100000) * (n / 100000);
    for(;del;del/=10)
        if(++temp2[del%10] > 1)
            return 0;
   
    del = (n % 100000) * (n % 100000);
    for(;del;del/=10)
        if(++temp3[del%10] > 1)
            return 0;
    return 1;
}

int main (void)
{
    long long i;

    for(i=1023456789;i<=1023456790;i++)
    {
        //printf("Checking number: %I64d\n",i);
        if(check(i)==1)
        {
            printf(" %I64d\n",i);
        }
    }
   
    printf("DONE!\n");
    getch();
}
2010-01-20 16:10
梁子
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:83
专家分:191
注 册:2009-9-20
收藏
得分:20 
#include <stdio.h>
int check(long long n)
{
    int temp1[10]={0};
    int temp2[10]={0};
    int temp3[10]={0};
    long long del,m;
    m=n;
    for(;m;m/=10)//注意这个地方,n以后还要用。
    {
        if(temp1[m%10]++ >= 1)//这里的++,应该放在后面吧。
            return 0;
    }
    del = (n / 100000)* (n / 100000);//这个地方,想用<<优化,结果不行,还是用*吧
    for(;del;del/=10)
    {
        if(temp2[del%10]++ >= 1)
            return 0;
    }
    del = (n % 100000) * (n % 100000);
    for(;del;del/=10)
        if(temp3[del%10]++ >= 1)
            return 0;
    return 1;
}
int main (void)
{
    long long i;
    for(i=5940300000;i<=5941000000;i++)//只能这样了,我可怜的cpu。。。
    {
        if(check(i)==1)
        {
            printf(" %I64d\n",i);
        }
    }
    printf("DONE!\n");
    //getch();
}

2010-01-20 18:00
梁子
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:83
专家分:191
注 册:2009-9-20
收藏
得分:0 
if(temp1[m%10]++ >= 1)//这里的++,应该放在后面吧。
貌似和楼主的(++temp1[n%10] > 1)一个效果,不好意思啊。

2010-01-20 18:06
xinjinlong
Rank: 3Rank: 3
来 自:河南南阳
等 级:论坛游侠
帖 子:61
专家分:117
注 册:2010-1-19
收藏
得分:0 
算法是对的,但是从32位向64位扩展的时候存在的问题,我也没有办法,问高手
2010-01-20 18:31
快速回复:一道题,大家帮我看看,我觉得我的程序写得没错,为什么算不出来
数据加载中...
 
   



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

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