為什么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。
本題滿分:19分
共4個用例:
(2分) 輸入: 3 輸出: 6
(3分) 輸入: 16 輸出: 720720
(5分) 輸入: 25 輸出: 26771144400
(9分) 輸入: 77 輸出: 410555180440430163438262940577600
最小公倍數就是所有質數的相應冪的積
比如N=10
小於10的質數有2,3,5,7
對應的最大冪是:3,2,1,1
則最小公倍數是:2^3x3^2x5^1x7^1 = 2520
1 #include <iostream> 2 #include <cstring> 3 #include <cmath> 4 using namespace std; 5 6 int a[50] = {0};//存素數 7 bool vis[100]; 8 int b[50] = {0};//存冪次 9 10 void init_prim()//求小於100的所有素數存入數組a 11 { 12 int i,j,k; 13 int m = (int)(sqrt(100.0)+0.5); 14 memset(vis,0,sizeof(vis)); 15 vis[0] = 1; 16 vis[1] = 1;//必須加上,否則第一個素數別認為是1 17 for(i=2; i<=m; i++) 18 if(!vis[i]) 19 { 20 for(j=2*i; j<=100; j+=i) 21 vis[j] = 1; 22 } 23 int t = 0; 24 for(k=0; k<100; k++) 25 if(!vis[k]) 26 a[t++] = k; 27 } 28 29 int main() 30 { 31 int i,j,k; 32 init_prim(); 33 int n; 34 //2^6 = 64,2^7 = 128;由於n最大100,冪次最大6 35 // for(i=0 ; i<100; i++)//素數沒問題 36 // if(!vis[i]) 37 // cout<<i<<endl; 38 // while(1); 39 while(cin>>n) 40 { 41 memset(b,0,sizeof(b)); 42 for(i=0; i<=n&&a[i]<=n; i++)//”1到n素數個數小於n的一半 “不對,3有兩個素數 43 { 44 // cout<<a[i]<<"-----"<<endl; 45 for(j=1; j<=6; j++) 46 { 47 if(pow((double)a[i],(double)j)>(double)n) 48 { 49 b[i] = j -1;//b的下標不必新開 50 break; 51 } 52 else if(pow((double)a[i],(double)j) == (double)n)//必須分開 53 { 54 b[i] = j; 55 break; 56 } 57 } 58 } 59 //不知道是不是pow函數的問題,把ans定義為int得出的結果出問題,double就對了 60 double ans = 1; 61 for(k=0; k<i; k++) 62 { 63 //cout<<a[k]<<"........"<<b[k]<<endl; 64 ans *= pow((double)a[k],(double)b[k]); 65 } 66 cout<<(int)ans<<endl; 67 } 68 return 0; 69 } 70 71 //該程序 到25時就溢出,ans換位long long前幾個就錯誤啦,此時需要把pow函數換掉
下面是大數版程序(提交通過)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 7 const int N = 105; 8 int n; 9 int a[N][50]; 10 int b[N] = {0}; 11 12 void multiply() 13 { 14 int i,j,k; 15 memset(a,0,sizeof(a)); 16 for(i=3; i<=100; i++) 17 { 18 /* 19 下面的是直接按平常的乘法,乘數的一位乘以被乘數的每一位並處理進位;另外是乘數整體乘以被乘數的每一位最后統一處理進位 20 */ 21 int temp = 0; 22 a[i][0] = 1;//很重要 23 for(j=2; j<=i; j++) 24 { 25 int c = 0; 26 for(k=0; k<50; k++)//最大不超過160位 ,安的是100!,最后除以3等50 27 { 28 temp = a[i][k]*b[j] + c; 29 a[i][k] = temp%1000; 30 c = temp/1000; 31 } 32 } 33 } 34 } 35 36 void printData(int n) 37 { 38 int i,j,k; 39 for(i=49; i>=0; i--) 40 if(a[n][i]) 41 break; 42 cout<<a[n][i];//第一個不輸出前導0 43 for(j=i-1; j>=0; j--) 44 printf("%03d",a[n][j]); 45 cout<<endl; 46 } 47 48 int main() 49 { 50 int i, j, k; 51 for(i=0; i<N; i++) 52 b[i] = i; 53 for(i=2; i<N; i++) 54 for(j=i+1; j<=N; j++) 55 { 56 if(b[j]%b[i]==0) 57 b[j] /= b[i]; 58 //cout<<b[j]<<endl; 59 } 60 //for(i=0; i<100; i++) 61 // cout<<b[i]<<endl; 62 //while(1); 63 multiply(); 64 65 while(cin>>n) 66 { 67 68 if(n==1||n==2) 69 { 70 cout<<n<<endl; 71 continue; 72 } 73 74 printData(n); 75 } 76 return 0; 77 } 78