编写C程序:求m~n之间的自守数

编写C程序,在键盘上输入整数m和n(10≤m<n≤200000),求出m~n之间的所有自守数,并且每行以5个数的形式输出。自守数是指一个数的平方的尾数等于该数自身的自然数... 编写C程序,在键盘上输入整数m和n(10≤m < n≤200000),求出m~n之间的所有自守数,并且每行以5个数的形式输出。
自守数是指一个数的平方的尾数等于该数自身的自然数。
例如,25就是一个自首数,因为252=625,末两位数字为25;76也是一个自守数,因为762=5776,末两位数为76;9376也是一个自守数,因为93762=87909376,末四位数为9376。
但由于 i 的取值范围[10,200000]比较大,所以( i * i )会溢出,请考虑溢出问题。
比如[10,200000]中一共有7个自守数
展开
 我来答
百度网友b598f2a65
2010-12-24 · 超过18用户采纳过TA的回答
知道答主
回答量:51
采纳率:0%
帮助的人:37.4万
展开全部
#include<stdio.h>
int main()
{
long mul, number, k, ll, kk;
printf("It exists following automorphisms numbers\nbigger than 10 and small than 200000:\n");

for(number = 10; number < 200000; number++)
{
for( mul = number, k = 1;(mul /= 10) > 0; k *= 10);
/*由number的位数确定截取数字进行乘法时的系数k*/
kk = k * 10; /*kk为截取部分积时的系数*/
mul = 0; /*积的最后n位*/
ll = 10; /*ll为截取乘数相应位时的系数*/
while (k>0)
{
mul=(mul+(number%(k*10))*(number%ll-number%(ll/10)))%kk;
/*(部分积+截取被乘数的后N位*截取乘数的第M位),%kk再截取部分积*/
k /= 10; /*k为截取被乘数时的系数*/
ll *= 10;
}

if (number == mul) /*判断若为自守数则输出*/
{
static int i = 0;
if (i++ % 5 == 0)
{
printf("\n");
}
printf("%8ld ",number);
}
}

printf("\n");
return 0;
}

参考资料: C++语言经典100例

wvlma59
2010-12-24 · TA获得超过257个赞
知道答主
回答量:296
采纳率:0%
帮助的人:226万
展开全部
#include<iostream>
#include<cmath>
using namespace std;

bool isZSS(unsigned int );

int main()
{
unsigned int a;
unsigned int n;
unsigned int m;
cout<<"输入m,n的值(m>10,n<200000):";
cin>>m>>n;
while(m<=10||m>=200000)
{
cout<<"\n输入m,n的值(m>10,n<200000)";
cin>>m>>n;
}
if(m>n)
{
int temp=m;
m=n;
n=temp;
}
for(unsigned int i=m;i<=n;i++)
{
if(isZSS(i))
cout<<i<<endl;
}
system("pause");
return 0;
}

bool isZSS(unsigned int x)
{
int a;
if(x/100000!=0)
a=6;
else if(x/10000!=0)
a=5;
else if(x/1000!=0)
a=4;
else if(x/100!=0)
a=3;
else if(x/10!=0)
a=2;

unsigned int y=x*x;
y=y-x;
if(y%static_cast<int>(pow(10.0,a))==0)
return true;
else
return false;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
下沙怪才
2010-12-24 · TA获得超过233个赞
知道小有建树答主
回答量:646
采纳率:0%
帮助的人:280万
展开全部
#include<stdio.h>
#include<string.h>
#include<math.h>

int m , n ;
int ans[100] , tot ;

void Init() {

tot = 0 ;

long long i ;
char s[20] ;
int size ;

for( i = 10 ; i <= 200000 ; ++i ) {
long long mult = i*i ;
sprintf( s , "%lld" , i ) ;
if( mult % (long) pow(10,strlen(s)) == i ) {
ans[tot++] = (int) i ;
}
}

}

int main() {

Init() ;

int i,m , n ;
for( ; scanf( "%d%d" , & m , & n ) ; ) {
int cnt = 0 ;
for ( i = 0 ; i < tot ; ++i ) {
if( ans[i] >= m && ans[i] <= n ) {
printf( "%d " , ans[i] ) ;

if( ++cnt % 5 == 0 ) {
puts( "" ) ;
cnt = 0 ;
}
}
}
}
return 0 ;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
创醉维z
2010-12-24 · TA获得超过458个赞
知道小有建树答主
回答量:181
采纳率:0%
帮助的人:0
展开全部
[10,200000]内的自守数
25
76
376
625
9376
90625
109376

#include <stdio.h>

bool Check(long long n,long long nn)
{
while(n)
{
if(n%10!=nn%10)
return false;
n/=10;
nn/=10;
}
return true;
}

int main()
{
int n,m;
long long i;
scanf("%d%d",&n,&m);
for(i=n;i<=m;i++)
if(Check(i,i*i))
printf("%lld\n",i);
return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式