编辑时间: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;
}