C++的求自守数的问题

#include<iostream>usingnamespacestd;intmain(){doublem,n;cout<<"请输入两个2~200000之间的数"<<en... #include <iostream>
using namespace std;
int main()
{
double m,n;
cout<<"请输入两个2~200000之间的数"<<endl;
cin>>m>>n;
int b;
int c=1;
int d=0;
while (m<=n)
{
b=m*m;
while (c<=m)
c=c*10;
if (b%c==m)
{
d++;
cout<<m<<" ";
if(d%5==0)
cout<<endl;
}
m++;
}
cout<<endl;
system ("pause");
return 0;
}

为什么他只能求道10000之后的就求不了了,怎么改才可以输出后面的,最好不要太大的修改,谢谢!
展开
 我来答
z3w1h4
推荐于2018-04-26 · TA获得超过639个赞
知道小有建树答主
回答量:418
采纳率:0%
帮助的人:271万
展开全部
b=m*m
b是int,范围2^-31到2^31,当m>2^16=65536时,b会溢出,无法正确求解
而9376下一个自守数是90625,肯定是求不出来的

解决方案:
如果不想写大整数乘法除法,或者调用非标准C++中的64位整型,那么可以借助数学手段简化问题

原题为求m,使m*m与m关于10^k同余,其中k是m的位数
那么就有m*m-m可以被10^k整除,
即m*(m-1)被2^k*5^k整除,
而m与(m-1)互质,则可以知道(2^k 整除 m && 5^k 整除 m-1) || (2^k 整除 m-1 && 5^k 整除 m)

代码:
#include <iostream>
using namespace std;
int main()
{
int m,n;
cout<<"请输入两个2~200000之间的数"<<endl;
cin>>m>>n;
int c=1;
int e=1,f=1;//修改处
int d=0;
while (m<=n)
{

while (c<=m)//修改处c=10^k,e=2^k,f=5^k
{
c=c*10;
e=e*2;
f=f*5;
}
if ((m%e==0 && (m-1)%f==0)||(m%f==0 && (m-1)%e==0))//修改处
{
d++;
cout<<m<<" ";
if(d%5==0)
cout<<endl;
}
m++;
}
cout<<endl;
system ("pause");
return 0;
}
笑年1977
2012-11-27 · TA获得超过7.2万个赞
知道大有可为答主
回答量:2.2万
采纳率:81%
帮助的人:1.1亿
展开全部
我没学过自守数,但我搜索到有关它的代码,其中有c++的
http://baike.baidu.com/view/604315.htm
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sonny213
2012-11-27 · TA获得超过139个赞
知道答主
回答量:49
采纳率:0%
帮助的人:46.4万
展开全部
那就是只有这几个是自守数了
用__int64吧
追问
恩,后来知道这种可以了,但想用数学手段简化。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式