| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9519 人关注过本帖
标题:自守数是指一个数的平方的尾数等于该数自身的自然数。如:76的平方=5776,求 ...
只看楼主 加入收藏
caifangxu123
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-4-13
结帖率:0
收藏
已结贴  问题点数:20 回复次数:18 
自守数是指一个数的平方的尾数等于该数自身的自然数。如:76的平方=5776,求出20000000以内的自守数并同时输出各个自守数的位数。
自守数是指一个数的平方的尾数等于该数自身的自然数。如:76的平方=5776,求出20000000以内的自守数并同时输出各个自守数的位数。

输入


输出
输出20000000内所有的自守数,每行输出一个数同时输出其位数。

样例输入
样例输出
1:       1
1:       5
1:       6
2:      25
2:      76
3:     376
3:     625
4:    9376
5:   90625
6:  109376
6:  890625
7: 2890625
7: 7109376
8:12890625
做了好几次都是错误  请大神帮忙下!!!!!!!!!
搜索更多相关主题的帖子: 自然数 
2017-04-18 20:10
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:4 
#include<stdio.h>
#include<math.h>
#define TOP 20000000
int main()
{
    long i,digits;             //digits是位数
    for(i=1;i<TOP;i++)
    {
        digits=(long)log10(i)+1;
        if((i*i-i)%(long)pow(10,digits)==0)
        {
            printf("%lld\t%9lld\n",digits,i);
        }
    }
    return 0;
}
//写了个这个出来,但是上了五位数答案就是错的,还没找到原因
2017-04-18 22:03
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:4 
回复 2楼 yangfrancis
很明显这样穷举是数据越界了~

案例当中是有规律的~如果用规律来计算就不用穷举~

有两种解决方案~要么用64位要么用数组保存数据来进行大位数乘法~

琢磨一下应该可以弄出来~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-18 22:08
caifangxu123
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-4-13
收藏
得分:0 
回复 2楼 yangfrancis
麻烦找下 我也在寻找呢
2017-04-18 22:55
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
还是回一下~明显个位数只能为5和6

因为一个数的尾数不变~平方数的尾数也不会变~
所以可以用迭代来进行搜索~

举个例子~第一次先搜1~10这样搜出了5和6成立的~

然后第二次就搜15 16 25 26 35 36……这样

这样在100以内就搜出了25 和76是成立的~

第三次搜125 176 225 276 325 376这样……

把数据溢出问题解决就可以了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-18 23:00
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
回复 3楼 九转星河
用64位怎么用法呢?_int64吗?这个我试过,还是有问题。大位数乘法就背油了。等于还要专门另写个程序。
只遍历个位5, 6的数是个很好的策略
2017-04-19 12:03
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
//还是解决了,可以不动用大位数乘法

#include<stdio.h>
#include<math.h>
#define N 20000000
long GetDigit(long m,unsigned int i)//按数位返回,若m=1024,i=1,返回4(个位),若i=4,则返回1000(千位)
{
    return m%(long)pow(10,i)-((i>1)?m%(long)pow(10,i-1):0);
}
long GetTail(long m,unsigned int i)//按尾数返回,返回m的后i位
{
    return m%(long)pow(10,i);
}
int main()
{
    long i,j;
    int ones;//个位值
    int digits;//位数
    long factor1,factor2;
    long tail;//乘积的尾数
    for(i=1;i<N;i++)
    {
        ones=i%10;
        if(ones==1||ones==5||ones==6)
        {
            tail=0;
            digits=log10(i)+1;
            for(j=1;j<=digits;j++)
            {
                tail+=GetDigit(i,digits-j+1)*GetTail(i,j);
            }
            if(tail%(long)pow(10,digits)==i)
                printf("%d\t%9ld\n",digits,i);
        }
    }
    //printf("%ld\n",GetTail(352098,4));
    return 0;
}
2017-04-20 09:58
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:4 
使用位运算应该可以,用&,(x*x)&(x)==x,则是该数自然数,等会有空了我验证一下
2017-04-20 11:52
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:0 
以下是引用yanzy在2017-4-20 11:52:10的发言:

使用位运算应该可以,用&,(x*x)&(x)==x,则是该数自然数,等会有空了我验证一下


-----------------
这个想法是错的
2017-04-20 12:37
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:4 
回复 7楼 yangfrancis

就是到大数出数有点慢。估计按位乘,对结果按位对比余数并按位除可避开大数溢出。
2017-04-20 18:13
快速回复:自守数是指一个数的平方的尾数等于该数自身的自然数。如:76的平方=57 ...
数据加载中...
 
   



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

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