標籤:
最小公倍數
時間限制:1000 ms | 記憶體限制:65535 KB
難度:3
描述
為什麼1小時有60分鐘,而不是100分鐘呢?這是曆史上的習慣導致。
但也並非純粹的偶然:60是個優秀的數字,它的因子比較多。
事實上,它是1至6的每個數位倍數。即1,2,3,4,5,6都是可以除盡60。
我們希望尋找到能除盡1至n的的每個數位最小整數m.
輸入
多組測試資料(少於500組)。
每行只有一個數n(1<=n<=100).
輸出
輸出相應的m。
範例輸入
2
3
4
範例輸出
2
6
12
可以發現,1到n的最小公倍數,是1到n-1的最小公倍數乘以n的所有素因子中沒有被1到n-1包含的素因子。
例如:1到7的最小公倍數是2*3*2*5*7,8=2*2*2,(8中2出現3次,1到7的素因子中只出現2次)那麼1到8就是2*3*2*5*7*2
#include <iostream>#include <string.h>//memset函數的標頭檔 using namespace std;#define M 105#define MAX 1000int main() { int a[M],i,j; int b[1000]; for(i=1; i<M; i++) a[i]=i; /*因為當前數可能是以後數的因子,則把當前數以後的數的因子去掉,剩餘的數相乘就好啦*/ for(i=2; i<M; i++) { for(j=i+1; j<M; j++) { if(a[j]%a[i]==0) { a[j]=a[j]/a[i]; } } } int n; int c;//餘數 int s; while(cin>>n) {// memset(b,0,1000*sizeof(int)); memset(b,0,sizeof(b)); b[0]=1;//將b[1]-b[n]中所有數相乘起來就是最小公倍數 for(i=2; i<=n; i++) { //乘以a[i] c=0; for(j=0; j<MAX; j++) { s=b[j]*a[i]+c; b[j]=s%10; c=s/10; } } //輸出 for(j=MAX-1; j>=0; j--) //忽略前置0 if(b[j]) break; for(i=j; i>=0; i--) cout<<b[i]; cout<<endl; } return 0;}
nyoj 517 最小公倍數