求1-10000之间的同构数

“同构数”是指这样的整数:它恰好出现在其平方数的右端。如:376*376=141376。请找出10000以内的全部“同构数”

来自360问答的题目,试着写了写,好歹实现了。

/*总结思路:
1.求出1-10000之间每个数的位数(即这个数是几位数)
2.再求出每个数的平方值,提取出最右端对应位数的数值出来(如369是个三个数,它的平方是136161,用取模%法提取出最右三位数字161)
3.最好对比i与右端数 是否相等,相等即为同构数*/
# include<stdio.h>

void main(void)
{
int digit = 0; //记录同构数的位数
int square = 0; //记录平方值
int rightvalue = 0; //平方数的右端的值
int t =0, times =1;//临时变量(循环期间会重置)

for(int i=1; i<=10000; i++){
digit = 0 ; //每次循环重置位数 
rightvalue = 0;
times = 1;
t = i;
square = i * i;
while(t){
t/=10;
digit++;
}
while(digit--){
rightvalue += (square%10)*times;
square/=10;
times *= 10;
}
if(i == rightvalue){

printf("%d * %d = %d\n", i, i, i*i);
}

}
}
/******VC++6.0中执行结果如下*********
1 * 1 = 1
5 * 5 = 25
6 * 6 = 36
25 * 25 = 625
76 * 76 = 5776
376 * 376 = 141376
625 * 625 = 390625
9376 * 9376 = 87909376
************************************/

新增算法:(执行结果同上)

/*	这两天还在想这个问题,感觉多重if判定比上面多重循环要更优一点。
	不过前面的算法太复杂,但更大的数值判定不须再增加条件去,改i的范围就行
	而这个数值每多一位数要加一重判定,好处是简单易懂。	*/
/*
思路:
	1.先明确i数值的位数,再用i平方的值(i*i)取余
	2.对i的平方值取余的位数等同i这个数值的位数
		(如i=123为3位数,123*123=15129,对15129取三个余数,即15129%1000 = 129)
	3.对比i == (i*i)%10 (位数每增加1位,%取余位相应增加)
*/
# include<stdio.h>

void main(void)
{
	for(int i = 1; i<=10000; i++){
		if(i>=1 && i<=9){	//i是1位数时
			if(i == (i*i)%10)//(注意*的运算优先级大于%,后面都不加括号了)
				printf("%d * %d = %d\n", i, i, i*i);
		}
		else if(i>=10 && i<=99){	//i是2位数时
			if(i == i*i%100)	
				printf("%d * %d = %d\n", i, i, i*i);
		}
		else if(i>=100 && i<=999){	//i是3位数时
			if(i == i*i%1000)
				printf("%d * %d = %d\n", i, i, i*i);
		}
		else if(i>=1000 && i<=9999){	//i是4位数时
			if(i == i*i%10000)
				printf("%d * %d = %d\n", i, i, i*i);
		}
	/*	if(i==10000){	//当i为10000时,明显不会是同构数,这里不作判定
		
		}*/	
	}
}



  • 20
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值