zoukankan      html  css  js  c++  java
  • 最小公倍数 大数问题

     1  #include<stdio.h>
     2  #include<string.h>
     3  #define N 50
     4  int len,a[N]={1};
     5  char tab[100][45]={0,1};
     6  inline int gcd(int a,int b)
     7  {
     8      return b==0?a:gcd(b,a%b);
     9  }
    10  int mod(int t) //求余
    11  {
    12      int i,k;
    13      for(k=0,i=len-1;i>=0;--i){
    14          k=(k*10+a[i])%t;
    15      }
    16      return k;
    17  }
    18  void fun(int m,int n)  //乘以m再除以n
    19  {
    20      int i,j,k,c;
    21      int s[N];
    22      for(c=i=0;i<len+2;++i){
    23          k=a[i]*m+c;
    24          a[i]=k%10;
    25          c=k/10;
    26      }
    27      for(i=len+1;i>=0&&!a[i];--i);
    28      len=i+1;
    29      for(k=j=0,i=len-1;i>=0;--i){
    30          k=k*10+a[i];
    31          s[j++]=k/n;
    32          k%=n;
    33      }
    34      len=j;
    35      memset(a,0,sizeof(a));
    36      for(i=0;i<len;++i)
    37          a[i]=s[len-i-1];
    38      for(i=len;!a[i];--i);
    39      len=i+1;
    40  }
    41  int main()
    42  {
    43      int i,j,k,t,n;
    44      for(len=1,i=2;i<=100;++i){//打表
    45          t=mod(i);
    46          if(t){
    47              k=gcd(i,t);
    48              fun(i,k);
    49          }
    50          for(tab[i-1][0]=j=len-1;j>=0;--j)
    51              tab[i-1][j+1]=a[j];
    52      }
    53      while(~scanf("%d",&n)){
    54          for(j=tab[n-1][0]+1;j>0;--j)
    55              printf("%d",tab[n-1][j]);
    56          printf("
    ");
    57      }
    58      return 0;
    59  }
    View Code

    考虑到1-100的最小公倍数肯定超出__int64.所以需要转化成字符串问题来解

    仔细观察会发现,【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

  • 相关阅读:
    开工--行胜于言
    操作系统之内存管理
    C陷阱与缺陷读书笔记(一)
    关于复杂度的一些基本的定义
    归并排序
    快速排序
    前序中序后序非递归遍历
    直接插入排序
    冒泡排序
    程序内存映像
  • 原文地址:https://www.cnblogs.com/WDKER/p/5461294.html
Copyright © 2011-2022 走看看