从大一第二学期开始就接触OJ平台并且在上面开始做题,现在是大二第一学期末了,因为在此期间都是间断式地在“水”题,有一段时间还因为忙学Java没有上去做题(即使上面也可以用Java语言提交答案)。我也没有刻意去看一下算法啊,数据结构的书,看到题目我都是直接就想的。不去考虑会不会运行超时啊,也没有考虑是不是数据溢出之类的,没有自己设更多的测试用例……。
就这样,我的水平最多也就可以解决难度为3的题目了,之后那些题目看了之后都不知道从何下手,所以都没有去尝试(我知道这样不好)。其实,说真的要我真的去深入学算法我可能真的学不下去,我觉得学算法还要有一定的先天基础。好吧,来看一下这道题吧。
题目:买水果
题目:K尾相等数(难度:1)
-
描述
-
输入一个自然数K(K>1),如果存在自然数M和N(M>N),使得K^M和K^N均大于等于1000,且他们的末尾三位数相等,则称M和N是一对“K尾相等数”。下面请编程求出M+N最小的K尾相等数。
-
输入
-
第一行包含一个正整数T,T<10000,表示有T组数据;
随后有N行,每行包括一个整数K(K<2*10^10);
输出
- 对于输入的每个整数K,输出对应的M+N的最小值; 样例输入 1 2 样例输出 120
我的C语言代码:<em><strong>#include<stdio.h> int main(){ int t; scanf("%d",&t); while(t--){ int a[1010],k,m=0,s=1,i; scanf("%d",&k); for(i=0;i<1010;i++) a[i]=0; while(s<1000){ s*=k; m++; } s%=1000; k%=1000; a[s]=m; while(1){ s=s*k%1000; m++; if(a[s]){ printf("%d\n",a[s]+m); break; } else a[s]=m; } } return 0; }</strong></em>
-
第一行包含一个正整数T,T<10000,表示有T组数据;
首先,看到这道题我的第一反应就是不可能用按照正常的穷列举去把数乘出来,这样是完成不了的。所以是一定要用一些方法来简化的。我这种方法就把多位的题目简化为千位以内的计算题目了。其实,你只要在纸上把它给的样例写一写,你慢慢就会有思路了。就是末尾三位数一定会在某个时候重复,而我们要的就是重复的这个时刻。题目中要我们求最小值,其实我们也知道M+N会以倍数一直往上涨的。所以,在里面用了一个循环(看起来好像要循环很多次,最多不会超过1000次的)就解决了。
当然,里面还有一些细节还是要靠平时自己积累的经验,写多了自然就会得心应手。
这是我第一次在CSDN博客上写文章,不知道写得好不好,希望读者可以给点建议,我会虚心接受的。先谢谢啦。