C语言找出1 99间全部同构数,07、找出1-99之间的同构数

找出1-99之间的同构数

找出1-99之间的同构数

程序代码如下:

/*

2017年3月12日12:58:35

功能;找出1-99之间的同构数

*/

#include"stdio.h"

int main()

{

for (int i = 1; i < 100; i++)

{

int Power_i = i *i;

if (i < 10)

{

int a = Power_i %10;

if (i == a)

{

printf("%2d 是 %4d 的同构数\n",i,Power_i);

}

}

else if(i >= 10 && i < 100)

{

int b = Power_i % 100;

if (i == b)

{

printf("%2d 是 %4d 的同构数\n", i, Power_i);

}

}

}

}

/*

总结:

1、同构数的特点是在于10以内的数,其平方数是不大于100的两位数,故取余保留一位数的方式是(%10)

而大于10小于100的数,其平方取余保留平方数后两位的方式(%100)

2、在VC++6.0中显示的结果:

————————————————————

1 是 1 的同构数

5 是 25 的同构数

6 是 36 的同构数

25 是 625 的同构数

76 是 5776 的同构数

————————————————————

*/

以下是借鉴YuJar博友(网易博客)的优秀的算法思想:

# include

void main(void)

{

int digit = 0;//记录同构数的位数

int square = 0;//记录平方值

int rightvalue = 0;//平方数右端的值

int t = 0, times ;//t是临时变量,(循环期间会重置)

for(int i=1; i<=10000; i++)

{

digit = 0 ;//每一次循环,之前的数据(位数、平方数右端的值)都会被重置

rightvalue = 0;

times = 1;//times = 1此赋值语句很关键

t = i;

square = i * i;

while(t)//此处不用i作判断,而是将i的值赋给一个临时变量t,是因为需要找出数据的特性,但是在做一些运算之后数据会改变,故用临时变量来参与运算

{

t /= 10;

digit++;

}

while(digit--)

{

rightvalue += (square%10)*times;   //在while语句中,每循环一次times的值都乘以10,times = 1表示此次循环计算个位上数据,times = 10表示此次循环计算十位上数据,依次下去...

square /= 10;//square/10取商上的数值,square%10取余数的数值。

times *= 10;

}

if(i == rightvalue)

{

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

}

}

}

/*

总结思路:

1.求出1-10000之间每个数的位数(即这个数是几位数)

2.再求出每个数的平方值,提取出最右端对应位数的数值出来(如369是个三个数,它的平方是136161,用取模%法提取出最右三位数字161)

3.最好对比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

***********************************

*/

优化算法:

/*

1、多重if判定比上面多重循环要更优一点。

2、不过前面的算法太复杂,但更大的数值判定不须再增加条件去,改i的范围就行

3、而这个数值每多一位数要加一重判定,好处是简单易懂。

4、if...else语句的特点是多种情况中在每一次循环时只有一种情况满足条件,每一种情况相互独立,执行完后进入下一次循环。

*/

/*

思路:

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

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);

}

}

}

来源:https://www.cnblogs.com/wxt19941024/p/6537686.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值