藍橋杯:公倍數NYOJ 517


為什么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     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM