C趣味程序(二)(13)同构数 |
|
www.nanhushi.com 佚名 不详 |
2.8 同构数 正整数n若是它平方数的尾部,则称n为同构数。例如,6是其平方数36的尾部,76是其平方数5776的尾部,6与76都是同构数。 试求指定位数的同构数序列。 1、算法分析: 对指定范围内的每一个整数a,求出其平方,判断a是否是其平方的尾部,通常有以下方法: 通过字符串子串比较找出同构数。 为了求更高位数的同构数,可应用同构数的以下性质:一个m位同构数的尾部m-1位数也是一个同构数。道理很简单,a是一个m位数,a的平方数尾部的m-1位仅由a尾部的m-1位决定而与a的最高位无关。 易知一个同构数有三个:1,5,6,则二位同构数的个位数字只可能是1,5,6这三个数字。 根据这一思路,我们可应用递推求出多位同构数串。
2.求指定区间内的同构数 程序代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h> char *right(char *ms,int len); /*截取一个字符串尾部长为len个字符的子串*/ void main() { long a; int len; char as[10]; char ms[20]; printf("求[1,10000]中的同构数:\n"); for(a=1;a<=10000;a++) { ultoa(a,as,10); /*数a转换为字符串,存入as*/ len=strlen(as); ultoa(a*a,ms,10); if(strcmp(as,right(ms,len))==0) /*比较字符串as与ms长为len的子串是否相等*/ printf("%s 其平方为 %s\n",as,ms); /*相等就是同构数,输出结果*/ } } char *right(char *ms,int len) /*截取字符串尾部长为len子串的函数*/ { int i,j; for(i=0;i<(signed)strlen(ms);ms++); for(j=0;j<len;j++,ms--); return ms;
} 程序运行结果如下:

|
|
|
文章录入:杜斌 责任编辑:杜斌 |
|
上一篇文章: C趣味程序(二)(12)求n环相亲数链 下一篇文章: C语言编程常见问题解答之常用函数的包含文件(1) |
【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
|