HDOJ-ACM 1018-1022解答及思路
1018
Problem Description
Output
Sample Input
Sample Output
题目要求
给出一个小于100万的数字,求出它的阶乘的位数
参考AC代码
|
|
思路
推导出一个正整数a的位数,如下:
接下来
注意事项
在写代码前先理清思路,在不能轻易算出100万这样的大数阶乘的情况下,从一般规律入手往往会得到简化。
1019
Problem Description
Input
Output
Sample Input
Sample Output
题目要求
输出n个数字的最小公倍数
参考AC代码
|
|
思路
先写出2个函数判断出2个数的最大公因数和最小公倍数,最小公倍数=两数之积/最大公因数。接着输入数据,每输入2个数字就立刻判断出它的最小公倍数,接着把它
和下一个数字比较,循环得出最后的最小公倍数。
注意事项
此题很容易超时和wrong answer。判断最大公因数的时候采用辗转相除法,可大大减少运算时间。而此题输入的数据均要采用long long型,使用int和long型都会提
示wrong answer。
1020
Problem Description
Input
Output
Sample Input
Sample Output
题目要求
要求把字符串实现合并同类项。
参考AC代码
|
|
思路
判断每一位的字符和下一个字符是否相等。若相等count++,接着进入循环判断下一个位置。若不相等则输出该字符和出现的次数,注意要讨论下次数为1不输出1即
可,count要再初始化为1进行下一轮判断。
注意事项
注意下一轮的判断count要赋值为1即可。
1021
Problem Description
Input
Output
Sample Input
Sample Output
题目要求
类似于斐波拉契数列。前2项和7和11,求第n项是否能被3整除。
参考AC代码
|
|
思路
公式:(a+b)%m=(a%m+b%m)%m。所以叠加的时候只需要加上每项除以3的余数即可。
注意事项
此题很容易超时或者超内存。尽量避免使用递归调用,运用上述公式可大大减少计算量。
1022
Problem Description
Input
Output
Sample Input
Sample Output
题目要求
模拟栈的原理。有最多9辆火车进站,给出进站顺序和出战顺序,判断是否可行。
参考AC代码
|
|
思路
此题极为重要,大多数人是第一次进行模拟栈。以下附给出解除第19行注释输出后的运行结果
该图可以清楚的看出6次循环每一步带来的变化。
用数组stack来模拟栈数据的存放,ok判断结果yes或no,flag用来判断若为yes后in和out的输出,top代表栈顶。while循环体的具体执行步骤是:第一步判断进入和
离开的数字是否相等,若相等,该火车直接进站后出战即可,A,B自加1,flag连续2个元素赋值为1和0,代表了in后out。不满足第一步则进行第二步判断出栈,若
栈顶没有到底部并且栈顶的元素和离开的元素相等,那么该元素离栈,flag该位置定义为0,B自增。前两步都不满足则进行第三步判断进栈,若A小于等于元素的个数。
则进栈,A自加。flag该位置定义为1。若前三步都不满足,则进行第四步,ok定义为0并且结束循环。最后若ok=1输出yes并按照flag的顺序,若为0输出out,若为1输
出in。
注意事项
该题的top初值必须赋为0而不能是-1,赋为0后实际存储的位置下标是用stack[1]开始的,这样在最后判断是够到达栈底不会因为top=-1而数组越界。而A和B都必须判断
为小于等于n而不能是小于n。while的循环体如果执行到最后是yes则会多执行一次。如图所示实际执行了6次循环体而不是5次,因为第6次进入的时候input[A]和ouput[B]
必然相等,因为都没被初始化过,B自增后不再满足while循环后退出,不会影响最后结果。并且当最后的结果为no时,会多执行进栈的那一步,会把没有初始化的元素赋
给stack,但也并不影响结果,因为下一个循环会因为均不满足前三次而直接执行第4步退出循环。所以修改代码若将小于等于号为小于号则得不到正确结果,多执行一步
可以满足该循环在yes和no的两种情况下都可以输出正确结果。若输出的结果为yes,因为多执行了1次第一步,所以i的元素多加了2,所以在最后输出flag元素的时候必
须写成j<i-2而不是j<i。该图stack存放的数据是49和50是因为把字符数据赋给了整型数组。最后输出格式也要留意。