C语言-求10000以内的同构数

说明

正整数n若是其平方数的尾部,则称n为同构数。例如,6是其平方数36的尾部,76是其平方数5776的尾部,6与76都是同构数。下面的程序求解不超过10000的所有同构数。

已知一位的同构数有三个:1,5,6,因此二位数的同构数的各位数字只可能是1,5,6,这三个数字。依次类推,更高位数同构数的个位数字也只可能是1,5,6,这三个数字。

下面程序的处理思路是:对不超过10000的每一个整数 a,判断其个位数字,若为1,5,6,则将 a 转换为字符串 as ,然后对 a 进行平方运算,并截取其尾部与 as 长度相等的若干字符形成字符串后与 as 比较,根据它们相等与否来断定 a 是否为同构数。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int myitoa(int, char *);   //整数转换为字符串
//*right 取得指定字符串尾部长度为length的子串,返回所得子串的首字符指针 
char *right(char *,int length); 

int main(){
	int a,t;
	int len;
	char as[10] ,rs[20];
	printf("[1,10000]内的同构数:\n");
	for(a=1;a<=10000;a++){
		t = a % 10;//取整数a的个位数字
		if(t!=1&&t!=5&&t!=6)  continue;
		len = myitoa(a,as); //数a转换为字符串,存入as
		myitoa(a*a,rs);		//数a的平方转换为字符串,存入rs 
		//比较字符串as与rs末尾长度为len的子串是否相等 
		if(strcmp(as,right(rs,len))==0){//若相同则是同构数并输出	 
			printf("%s的平方为%s\n",as,rs);	
		} 
	}
	return 0;
}

int myitoa(int num,char *s){
	int i,n=0;
	char ch;
	//从个位数开始,取num的每一位数字转换位字符后放入s[] 
	while(num){
		s[n++] = num % 10 + '0';
		num = num / 10;
	}
	s[n] = '\0';
	for(i=0; i<n/2 ;i++){ //将s中的字符串逆置
		ch = s[i];
		s[i]=s[n-i-1];
		s[n-i-1] = ch;
	}
	return n;
}
//取字符串ms尾部长度位length的子串,返回所得子串的首字符指针 
char *right(char *ms,int length){
	int i;
	for( ; *ms ;ms++); //使ms到达原字符串的尾部
	for(i=0;i<length;i++,ms--); //使ms指向所得子串的首部字符
	return ms; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值