蓝桥杯 公倍数
2016-05-23 20:19
274 查看
3. 公倍数
为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致。
但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多。
事实上,它是1至6的每个数字的倍数。即1,2,3,4,5,6都是可以除尽60。
我们希望寻找到能除尽1至n的的每个数字的最小整数。
不要小看这个数字,它可能十分大,比如n=100, 则该数为:
69720375229712477164533808935312303556800
请编写程序,实现对用户输入的 n (n<100)求出1~n的最小公倍数。
例如:
用户输入:
6
程序输出:
60
用户输入:
10
程序输出:
2520
要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
[cpp] view
plain copy
#include <iostream>
using namespace std;
char res[1000];
int isPrime[1000];
int solve(int n);
int main()
{
int n;
cin>>n;
int t = solve(n);
for(int i=t; i>=0; i--)
cout<<(int)res[i];
cout<<endl;
return 0;
}
int solve(int n)
{
for(int i=0; i<=n; i++)
isPrime[i] = 1;
isPrime[0] = isPrime[1] = 0;
int p = 0;
res[p++] = 1;
for(int i=2; i<=n; i++)
{
if(isPrime[i])
{
for(int j=i+1; j<=n; j++)
if(j%i==0)
isPrime[j] = 0;
//求小于该数的质数的指数值,即t=2^n,求小于n的最大的t
//如n=6时,2为4,3为3, 5为5
//所以结果为4*3*5=60
int tmp = i;
while(tmp<=n) tmp*=i;
tmp /= i;
int o = 0;
for(int s=0; s<p; s++)
{
int t = res[s] * tmp + o;
o = t /10;
res[s] = t%10;
}
while(o>0)
{
res[p++] = o%10;
o /= 10;
}
}
}
return p-1;
}
为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致。
但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多。
事实上,它是1至6的每个数字的倍数。即1,2,3,4,5,6都是可以除尽60。
我们希望寻找到能除尽1至n的的每个数字的最小整数。
不要小看这个数字,它可能十分大,比如n=100, 则该数为:
69720375229712477164533808935312303556800
请编写程序,实现对用户输入的 n (n<100)求出1~n的最小公倍数。
例如:
用户输入:
6
程序输出:
60
用户输入:
10
程序输出:
2520
要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
[cpp] view
plain copy
#include <iostream>
using namespace std;
char res[1000];
int isPrime[1000];
int solve(int n);
int main()
{
int n;
cin>>n;
int t = solve(n);
for(int i=t; i>=0; i--)
cout<<(int)res[i];
cout<<endl;
return 0;
}
int solve(int n)
{
for(int i=0; i<=n; i++)
isPrime[i] = 1;
isPrime[0] = isPrime[1] = 0;
int p = 0;
res[p++] = 1;
for(int i=2; i<=n; i++)
{
if(isPrime[i])
{
for(int j=i+1; j<=n; j++)
if(j%i==0)
isPrime[j] = 0;
//求小于该数的质数的指数值,即t=2^n,求小于n的最大的t
//如n=6时,2为4,3为3, 5为5
//所以结果为4*3*5=60
int tmp = i;
while(tmp<=n) tmp*=i;
tmp /= i;
int o = 0;
for(int s=0; s<p; s++)
{
int t = res[s] * tmp + o;
o = t /10;
res[s] = t%10;
}
while(o>0)
{
res[p++] = o%10;
o /= 10;
}
}
}
return p-1;
}
相关文章推荐
- springmvc下的基于token的防重复提交实现
- 国内最全面App渠道(Android版完整版)
- (译)POSIX Threads Programming(POSIX线程编程)
- 安装 sql server 2008 过程中遇到的问题及解决措施
- Android开发之使用MediaRecorder录制声音
- linux下安装配置pc2
- 设计模式 - Flyweight模式
- 【程序人生】:学习方法
- C++ limits头文件
- java jvm-类加载器层级结构
- 微信运营必须收藏的软件工具网站合集
- 心得
- PAT 1019数字黑洞
- 数据库的操作
- READING NOTE: R-FCN: Object Detection via Region-based Fully Convolutional Networks
- js下载文件功能
- 使用Canvas绘制不完美/不规则的圆形
- Axure 8.0中文版下载(支持windows和Mac)
- 欧拉模板
- Java Mail 发送带附件邮件