【ACM】K尾相等数
2016-05-18 16:03
246 查看
问题描述:
从键盘输入一个自然数K(K>1),若存在自然数M和N(M>N),使得K^M 和K^N均大于或等于1000,且它们的末尾三位数相等,则称M和N是一对”K尾相等数”。请编写程序,输出M+N最小的K尾相等数。
样例:
问题分析:
末尾三位数只有1000个,从1到无穷大增大幂次时,肯定会出现同样的末尾三位数,比如n=10时(n^M大于1000时才有末尾三位数),
所以当幂次为3时出现了第一个三位数,当幂次为4时出现了第二个三位数,N = 3,M = 4,且M+N最小。所以只要最先两次出现在同一个三位数框里的两个幂次就是我们所求的M和N。
代码如下:
从键盘输入一个自然数K(K>1),若存在自然数M和N(M>N),使得K^M 和K^N均大于或等于1000,且它们的末尾三位数相等,则称M和N是一对”K尾相等数”。请编写程序,输出M+N最小的K尾相等数。
样例:
输入 | 输出 |
---|---|
2 | 120 |
末尾三位数只有1000个,从1到无穷大增大幂次时,肯定会出现同样的末尾三位数,比如n=10时(n^M大于1000时才有末尾三位数),
幂次M | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
n^M | 10 | 100 | 1000 | 10000 | 100000 |
末尾三位数 | 无 | 无 | 0 | 0 | 0 |
代码如下:
#include <iostream> using namespace std; int main(){ int n; while(cin>>n) { int arr[1000]={ 0 }; bool b = false; if(n>=1000) { b = true; n=n%1000; } int c = 0; int k = 1; while(true){ c+=1; k*=n; if(k>=1000 || b == true) { k=k%1000; if(arr[k]==0) { arr[k]= c; } else { break; } } } cout<<(c+arr[k])<<endl; } return 0; }
相关文章推荐
- android studio学习日记
- tomcat中文乱码问题
- 硬盘上有损坏区域,该如何重新分区
- 91.Cocoapods的详细使用教程 (安装/使用/删除/注意)
- 使用WebStorm调试node工程
- tp下载已经存在的xlsx
- 在Java中用两种方法打印当前的时间,第一种方法是格式化法,第二种方法是日历法。
- 包和访问权限2
- 树学习总结
- Redis和Memcache的对比及选择
- 最强的匹配网址的正则表达式
- 自己构建mean framework
- 场景设计以及Manual Scenario和Goal-OrientedScenario的区别
- count lines in a file - wc & nl
- flume1.6.0的安装
- Android进度条自定义——类似ProgressDialog效果的Dialog
- 如何成为一名优秀的程序员
- Android Source Code Complie
- ASP.NET WebAPI 路由规则与POST数据 【转】
- linux:/etc/rc.local 不能自动启动问题