本文阅读对象,刚学循环的同学
同学A 9:35:14
一个自然数平方的末几位与该数相同时,称该数为同构数。编程求出1~1000中所有的同构数。
1 #include <stdio.h> 2 int main() 3 { 4 int n; 5 for(n=1;n<=1000;n++) 6 { 7 if((n*n-n)/10!=0&&(n*n-n)%10==0&&n%11!=0) 8 printf("%d\n",n); 9 } 10 return 0; 11 }
还有什么条件我想不到…
老师() 9:37:30
是OJ的题目还是书上的
同学A 9:37:40
书上的
老师() 9:39:10
应该是条件错了
if
老师() 9:40:42
条件是末几位与该数相同, 你如何保证着一点?
你自己的程序运行出来无法保证“末几位与该数相同”
同学A 9:41:20
是的
老师() 9:42:40
想一下,条件应该怎么样
同学A 9:42:56
嗯
同学B 9:46:56
应该对10或100取余数
大概吧
老师() 9:48:42
是这样意思,A同学明白一点了吗?
比如 5是, 因为(5*5-5)%10==0 为真
老师() 9:49:59
25也是,因为 (25*25-25) % 100==0为真
还有三位数的
同学A 9:52:08
但是这样的话会输出10,10应该不是
老师() 9:53:09
不会的, 10是两位数,应该满足(10*10-10) % 100==0为真
同学A 9:59:18
if(n*n-n)%10==0||(n*n-n)%100==0)这个条件下程序会输出10呀
老师() 9:59:45
不是告诉你了,条件写错了
最简单的是写一个多分支的
根据是几位数分别处理
同学A 10:00:32
多分支好麻烦
没有更好的办法了吗
老师() 10:01:18
先写正确了,再想办法优化才是正道
同学A 10:01:30
嗯
同学B 10:02:54
老师能不能用||来解决?
老师() 10:03:29
是可以缩进一条if语句的,自己多想想
同学B 10:05:32
编程get
老师() 10:05:54
但是要是我来推荐思考方法,我会说先找清晰但是可能不是那么简洁的解法, 然后在此基础上进行简化甚至转换思路
同学B 10:06:26
先对 再优化
老师() 10:06:37
是的
同学A 10:08:01
#include <stdio.h> int main() { int n; for(n=1;n<10;n++) { if((n*n-n)%10==0) printf("%d\n",n); } for(n=10;n<100;n++) { if((n*n-n)%100==0) printf("%d\n",n); } for(n=100;n<1000;n++) { if((n*n-n)%1000==0) printf("%d\n",n); } return 0; }
老师,现在对了,能不能优化呢
老师() 10:09:20
你这个多分支写得不算好
老师() 10:10:22
for(n=1;n<=1000;n++){ if ....else if...}视觉上面更舒服一点
同学A 10:11:05
我看这个挺好的……
老师() 10:12:01
我们的审美观不同,你这样的话就没有整合的可能
同学A 10:12:29
那我再去改
老师() 10:13:49
我给一个版本,你再去思考吧
老师() 10:14:56
#include <stdio.h> int main() { int n; for(n = 1; n <= 1000; n++) { int t = n * n - n; if((n < 10 && t % 10 == 0) || (n < 100 && t % 100 == 0) || (n < 1000 && t % 1000 == 0)) printf("%d\n", n); } return 0; }
同学B 10:15:46
对 就是这个
老师() 10:16:24
这个利用了||的短路性质,很多同学掌握得不好,可以体会一下
同学B 10:17:02
||之间要用括号?
同学A 10:17:12
谢谢老师,我再想想
老师() 10:17:35
至少逻辑上更清晰,不是吗
同学B 10:17:40
if((n < 10 && t % 10 == 0) || (n < 100 && t % 100 == 0) || (n < 1000 && t % 1000 ))
同学A 10:17:47
是的
同学B 10:17:48
对哦