找出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 的同构数 ",i,Power_i); } } else if(i >= 10 && i < 100) { int b = Power_i % 100; if (i == b) { printf("%2d 是 %4d 的同构数 ", 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<stdio.h> 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 ", 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<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 ", i, i, i*i); } else if(i>=10 && i<=99) { //i是2位数时 if(i == i*i%100) printf("%d * %d = %d ", i, i, i*i); } else if(i>=100 && i<=999) { //i是3位数时 if(i == i*i%1000) printf("%d * %d = %d ", i, i, i*i); } else if(i>=1000 && i<=9999) { //i是4位数时 if(i == i*i%10000) printf("%d * %d = %d ", i, i, i*i); } } }