69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
*Question 3
*给出一个正整数n(n<100),求一个最小的整数m使得m能整除1,2,3...n的所有数
*问题的算法思想并不难,关键在于大数的处理
*大数的处理思想为,用一个int数组,其中每一个int存储大数的一位数
*/
#define MAX 50
/*
*令数组的每一位都恢复到合法值
*/
void Check(int Digit[])
{
int iter;
for(iter = 0 ; iter != MAX-1 ; ++iter)
{
while(Digit[iter] < 0)
{
Digit[iter] += 10;
Digit[iter+1] -=1;
}
while(Digit[iter] > 9)
{
Digit[iter] -= 10;
Digit[iter+1] +=1;
}
}
}
void Output(int Digit[])
{
int iter;
for(iter = MAX-2 ; iter != -1 ; --iter)
{
if(Digit[iter] != 0)break;
}
for( ; iter != -1 ; --iter)
{
printf("%d",Digit[iter]);
}
printf("\n");
}
/*
*是否大于
*/
int IsBigger(int Digit[], int cmp)
{
int iter;
static int Temp[MAX];
memset(Temp,0,sizeof(Temp));
Temp[0] = cmp;
Check(Temp);
for(iter = MAX-2 ; iter != -1 ; --iter)
{
if(Temp[iter] > Digit[iter]) return 0 ;
else if(Temp[iter] < Digit[iter]) return 1;
}
return 1;
}
/*
*大数与int直接作减法
*/
void Sub(int Digit[] , int sub)
{
Digit[0] -= sub;
Check(Digit);
}
/*
*大数与int直接作加法
*/
void Add(int Digit[] , int add)
{
Digit[0] += add;
Check(Digit);
}
void Mul(int Digit[] , int mul)
{
int iter;
for(iter = 0 ; iter != MAX ; iter++)
{
Digit[iter] *= mul;
}
Check(Digit);
}
/*
*判断是不是0
*/
int IsZero(int Digit[])
{
int iter;
for(iter = 0 ; iter != MAX ; ++iter)
{
if(Digit[iter] != 0) return 0;
}
return 1;
}
/*
*转化
*/
void Set(int Digit[] , int data)
{
int iter = 0;
memset(Digit,0,sizeof(int) * MAX);
while(data != 0)
{
Digit[iter] = data%10;
data /= 10;
iter++;
}
}
int Get(int Digit[])
{
int data = 0;
int iter;
for(iter = MAX-2 ; iter != -1 ; --iter)
{
data = data*10 + Digit[iter];
}
return data;
}
/*
*求余数
*/
int Mod(int Digit[] , int num)
{
while(1)
{
if(IsBigger(Digit,num))
{
Sub(Digit,num);
}
else
{
return Get(Digit);
}
}
}
int gcd(int Digit[] , int cmp)
{
int mod = Mod(Digit,cmp);
while(mod != 0)
{
Set(Digit,cmp);
cmp = mod;
mod = Mod(Digit,mod);
}
return cmp;
}
int main()
{
int input,iter;
int output[MAX];
int Buffer[MAX];
memset(output,0,sizeof(output));
scanf("%d",&input);
output[0] = input;
Check(output);
for(iter = input ; iter != 1 ; --iter)
{
memcpy(Buffer,output,sizeof(output));
Mul(output,iter/gcd(Buffer,iter));
}
Output(output);
return 0;
}
弄了个最平凡的, 算1W以内的, 好像也够用了, 就不做优化了...
#include <stdio.h>
int mul( int len , int v[] , int b )
{
int i;
v[len] = 0;
for( i = 0; i < len; ++i )
v[i] *= b;
for( i = 0; i < len; ++i )
{
v[i+1] += v[i] / 10000;
v[i] %= 10000;
}
if( v[len] ) ++len;
return len;
}
#define MAXN 10000
void slove( int n )
{
int i , j ;
int f[MAXN+2] = {0};
int r[MAXN*4] = {1} , len = 1;
for( i = 2; i <= n; ++i )
{
int x = i;
for( j = 2; j <= x; ++j )
{
if( x % j == 0 ) {
int c = 0;
do
{
++c;
x /= j;
} while( x % j == 0 );
if( c > f[j] ) f[j] = c;
}
}
}
for( i = 2; i <= n ; ++i )
{
while( f[i] )
{
--f[i];
len = mul( len , r , i );
}
}
printf( "%d" , r[len-1] );
for( i = len-2; i >= 0; --i )
printf( "%04d" , r[i] );
printf( "\n" );
}
int main()
{
int n;
while( 1 == scanf( "%d" , &n ) && n > 0 && n <= MAXN )
slove( n );
return 0;
}