初学者编程编程实战指南

本文阅读对象,刚学循环的同学

同学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
对哦

时间: 2024-10-11 01:10:29

初学者编程编程实战指南的相关文章

Java多线程编程模式实战指南(三):Two-phase Termination模式--转载

本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-termination.转载请注明作者: 黄文海 出处:http://viscent.iteye.com. 停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程时还有一些额外的细节需要考虑,如待停止的线程处于阻塞(等待锁)或者等待状态(等待其它

Java多线程编程模式实战指南(二):Immutable Object模式--转载

本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-object.转载请注明作者: 黄文海 出处:http://viscent.iteye.com. 多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线程安

Java多线程编程模式实战指南(一):Active Object模式--转载

本文由黄文海首次发布在infoq中文站上:http://www.infoq.com/cn/articles/Java-multithreaded-programming-mode-active-object-part1 .转载请注明作者: 黄文海 出处:http://viscent.iteye.com. Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心

Java多线程编程模式实战指南之Promise模式

Promise模式简介(转) Promise模式是一种异步编程模式 .它使得我们可以先开始一个任务的执行,并得到一个用于获取该任务执行结果的凭据对象,而不必等待该任务执行完毕就可以继续执行其他操作.等到我们需要该任务的执行结果时,再调用凭据对象的相关方法来获取.这样就避免了不必要的等待,增加了系统的并发性.这好比我们去小吃店,同时点了鸭血粉丝汤和生煎包.当我们点餐付完款后,我们拿到手的其实只是一张可借以换取相应食品的收银小票(凭据对象)而已,而不是对应的实物.由于鸭血粉丝汤可以较快制作好,故我们

Java多线程编程模式实战指南(三):Two-phase Termination模式

停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程时还有一些额外的细节需要考虑,如待停止的线程处于阻塞(等待锁)或者等待状态(等待其它线程).尚有未处理完的任务等.本文介绍的Two-phase Termination模式提供了一种通用的用于优雅地停止线程的方法. Two-phase Termination模式简介 Java并没有提供直接的API用于停止线程.Two-phase Termination模式通过将停止线程这个动作分解为准备阶

Java多线程编程模式实战指南一:Active Object模式(上)

Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它允许任务的提交(相当于对异步方法的调用)和任务的执行(相当于异步方法的真正执行)分离.这有点类似于System.gc()这个方法:客户端代码调用完gc()后,一个进行垃圾回收的任务被提交,但此时JVM并不一定进行了垃圾回收,而可能是在gc()方法调用返回后的某段时间才开始执行任务--回收垃圾.我们知

Java多线程编程模式实战指南(二):Immutable Object模式

多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线程安全,又能避免引入锁可能带来的问题和开销. Immutable Object模式简介 多线程环境中,一个对象常常会被多个线程共享.这种情况下,如果存在多个线程并发地修改该对象的状态或者一个线程读取该对象的状态而另外一个线程试图修改该对象的状态,我们不得不做一些同步访问控制以保证数据一致性.而这些同

Java多线程编程模式实战指南一:Active Object模式(下)

Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个好处是它可以将任务(MethodRequest)的提交(调用异步方法)和任务的执行策略(Execution Policy)分离.任务的执行策略被封装在Scheduler的实现类之内,因此它对外是不"可见"的,一旦需要变动也不会影响其它代码,降低了系统的耦合性.任务的执行策略可以反映以下一些

Java多线程编程模式实战指南:Active Object模式(下)

Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个好处是它可以将任务(MethodRequest)的提交(调用异步方法)和任务的执行策略(Execution Policy)分离.任务的执行策略被封装在Scheduler的实现类之内,因此它对外是不“可见”的,一旦需要变动也不会影响其它代码,降低了系统的耦合性.任务的执行策略可以反映以下一些问题: 采

Java多线程编程实战指南(设计模式篇,黄文海)-之管道线模式

不得不说,本人工作上很少有使用多线程编程技术的地方.由于本人工作上经常使用的是类似SSH等框架搭建MVC架构,所以更加习惯于编写一些优秀程序员所唾弃的样板式的代码.最近看了文海的多线程编程实战指南,瞬间眼前一亮.觉得有很多自己可以学习的,事实上,我已经在最近的项目中使用上了那本书介绍的两相终止模式.串行封闭模式.生产者消费者模式以及线程池等技术,确实在许多方面改进了我们服务端的吞吐量.说到这里本人吐槽一下,由于是毕业后转行,目前也才工作一年还不满2个月.所以原谅我的得瑟,但我相信我以后会做的更好