您的位置:首页 > 其它

max公约数+min公倍数+水仙花+分解因数 +

2015-09-07 20:05 295 查看
编辑时间:2015.9.7.13.32

一、 最大公约数

背景:

1、最大公约数就是 比如10 和15, 最大公约数 就是5;最小公倍数就是30(10*15/5).

int max_gongyue_dec(int x, int y)
{
	while(x != y)  /*相减法,反复用 大数 减去小数, 最终 当一个数 是另一个数的两倍时, 相减, 然后相等,即为最大公约数*/
	{
		if (x > y) x = x-y;
		if (y > x) y = y-x;
	}

	return x;
}

int max_gongyueshu_div(int x, int y)
{
	int c = 0;
                 /*相除法, 其思想和相减法 相似, 只是用取模, 一次就是的 x与y差距变小, 最后两者相等 时, 再取模为0,退出*/
	while(y)
	{
		c = x % y;
		x = y;
		y = c;
	}

	return x;
}


二、水仙花数

如,153 = 1^3+5^3+3^3, 这样的数叫做水仙花数。

int func(int x, int n)
{
	int i = 0, ret = 1;

	if ((0 == x) && (0 == n))
	{
		printf("Invalid num\n");
		return -1;
	}
	else if (0 == x) return 0;
	else if (0 == n) return 1;

	for (i = 1; i <=n; i++)
		ret = ret * x;

	return ret;
}

/*if long a is a shui xian num, rtn 1, else rtn 0*/
int easy_shuixian(long a)
{
	int s[10] ={ 0 };
	long tmp = 0, sum = 0;
	int  i = 0, j = 0;

	tmp = a;

	while(tmp)   /*get i bits, and save it*/
	{
		s[i++] = tmp%10;
		tmp = tmp / 10;
	}

	for(j = 0; j < i; j ++)
		sum += func(s[j], i);	

	if (a == sum)
	{	
		printf("a=>%d<,sum=>%d<\n", a, sum);	
		return 1;
	}
	
	return 0;
}


三、分解因数

1、从2 开始, 反复除以2,直到不能整除,再除以3, ……终点是除以 它本身;

2、输出为 12=2*2*3 的格式。

int fenjie_yinshu(int a)
{
	int i,tmp, n, symbol = 1;/*暂时不考虑负数情形, 若是负数,则记录符号位,并变成正数处理*/
	
	n = a;
	printf("%d=", n);

	if ((1 == a) || (0 == a))
		printf("%d", a);

	for(i = 2; i <= a; i++)
	{
		while(!(n%i))
		{
			n = n/i;
			if (1 == n)  printf("%d", i);
			else         printf("%d*", i);
		}
	}
	
	printf("\n");
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: