首页
社区
课程
招聘
[原创]质因数分解 C语言
2011-3-19 18:38 14338

[原创]质因数分解 C语言

2011-3-19 18:38
14338
可以分解2^64-1内的数,速度很快,傻瓜级代码,就不做注释了
#include <stdio.h>
#include <windows.h>

const unsigned __int64 prime[2] = {2,3};
const int primeNumTblSize = sizeof(prime) / sizeof(prime[0]);

void PrintFactorization( unsigned __int64 srcNum, unsigned __int64 baseNum )
{
	unsigned __int64 yinzi[64] = {0};
	int mi[64] = {0};
	int numOfYinzi = 0;
	if (srcNum == 1 || srcNum == 0)
		printf("is neither a prime number nor a composite number\n**************************************************\n", srcNum);
	else if (srcNum < 4)
		printf("is a prime number.\n**************************************************\n");
	else
	{
		while (srcNum > 1)
		{
			for (int i = 0; i < primeNumTblSize; i++)
			{
				if (srcNum % prime[i] == 0)
				{
					if (numOfYinzi == 0)
					{
						yinzi[0] = prime[i];
						mi[0]++;
						numOfYinzi++;
					} else
					{
						if (yinzi[numOfYinzi-1] == prime[i])
							mi[numOfYinzi-1]++;
						else
						{
							yinzi[numOfYinzi] = prime[i];
							mi[numOfYinzi]++;
							numOfYinzi++;
						}
					}
					srcNum /= prime[i];
					break;
				}
			}
			if (i >= primeNumTblSize)
			{
				for (baseNum; baseNum * baseNum <= srcNum; baseNum += 6)
				{
					if (srcNum % baseNum == 0)
					{
						if (numOfYinzi == 0)
						{
							yinzi[0] = baseNum;
							mi[0]++;
							numOfYinzi++;
						} else
						{
							if (yinzi[numOfYinzi-1] == baseNum)
								mi[numOfYinzi-1]++;
							else
							{
								yinzi[numOfYinzi] = baseNum;
								mi[numOfYinzi]++;
								numOfYinzi++;
							}
						}
						srcNum /= baseNum;
						break;
					} else if (srcNum % (baseNum + 2) == 0)
					{
						if (numOfYinzi == 0)
						{
							yinzi[0] = (baseNum + 2);
							mi[0]++;
							numOfYinzi++;
						} else
						{
							if (yinzi[numOfYinzi-1] == (baseNum + 2))
								mi[numOfYinzi-1]++;
							else
							{
								yinzi[numOfYinzi] = (baseNum + 2);
								mi[numOfYinzi]++;
								numOfYinzi++;
							}
						}
						srcNum /= (baseNum + 2);
						break;
					}
				}
				if (baseNum * baseNum > srcNum)
				{
					if (numOfYinzi == 0)
					{
						yinzi[0] = srcNum;
						mi[0]++;
						numOfYinzi++;
					} else
					{
						if (yinzi[numOfYinzi-1] == srcNum)
							mi[numOfYinzi-1]++;
						else
						{
							yinzi[numOfYinzi] = srcNum;
							mi[numOfYinzi]++;
							numOfYinzi++;
						}
					}
					srcNum = 1;
				}
			}
		}
		if (numOfYinzi == 1 && mi[0] == 1)
			printf("is a prime number.\n**************************************************\n");
		else
		{
			printf("= ");
			for (int ww = 0; ww < numOfYinzi-1; ww++)
			{
				if (yinzi[ww] != 0)
					mi[ww] == 1 ? printf("%I64u x ", yinzi[ww]) : printf("%I64u^%d x ", yinzi[ww], mi[ww]);
			}
			mi[numOfYinzi-1] == 1 ? printf("%I64u\n", yinzi[numOfYinzi-1]) : printf("%I64u^%d\n", yinzi[numOfYinzi-1], mi[numOfYinzi-1]);
			printf("**************************************************\n");
		}
	}
}

int main(int argc,char *argv[])
{
	system("title Factorization v1.1 -- DevilHand Presents");
	unsigned __int64 srcNum = 0;
	unsigned __int64 baseNum = 5;
	int scanfRet = 0;
	int suanfa = 2;
	printf("**************************************************\n");
	printf(" * Factorization v1.1\n");
	printf(" * DevilHand Presents 2011-03-18\n");
	printf(" * Email: DevilHand@126.com\n");
	printf("**************************************************\n");
	while (1)
	{
		srcNum = 0;
		do {
			fflush(stdin);
			printf("Input a number: ");
			scanfRet = scanf("%I64u", &srcNum);
		} while (EOF == scanfRet || 0 == scanfRet);
		printf("Result: %I64u ", srcNum);
		PrintFactorization(srcNum, baseNum);
	}
	return 0;
}

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞6
打赏
分享
最新回复 (7)
雪    币: 163
活跃值: (56)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
DEVILHAND 2 2011-3-19 18:39
2
0
一些分解结果:
**************************************************
* Factorization v1.1
* DevilHand Presents 2011-03-18
* Email: DevilHand@126.com
**************************************************
Input a number: 12157665459056928801
Result: 12157665459056928801 = 3^40
**************************************************
Input a number: 9966332255887744111
Result: 9966332255887744111 is a prime number.
**************************************************
Input a number: 18446744073709551520
Result: 18446744073709551520 = 2^5 x 5 x 2663 x 43294085790719
**************************************************
Input a number: 18446744073709551608
Result: 18446744073709551608 = 2^3 x 2305843009213693951
**************************************************
Input a number: 10459
Result: 10459 is a prime number.
**************************************************
Input a number: 90541
Result: 90541 = 11 x 8231
**************************************************
Input a number: 142857
Result: 142857 = 3^3 x 11 x 13 x 37
**************************************************
Input a number: 428571
Result: 428571 = 3^4 x 11 x 13 x 37
**************************************************
Input a number: 999999
Result: 999999 = 3^3 x 7 x 11 x 13 x 37
**************************************************
Input a number: 951463287
Result: 951463287 = 3^3 x 23 x 547 x 2801
**************************************************
Input a number: 614889782588491410
Result: 614889782588491410 = 2 x 3 x 5 x 7 x 11 x 13 x 17 x 19 x 23 x 29 x 31 x
37 x 41 x 43 x 47
**************************************************
Input a number: 142857142857
Result: 142857142857 = 3^3 x 11 x 13 x 37 x 101 x 9901
**************************************************
Input a number: 114422885577
Result: 114422885577 = 3^4 x 7 x 11 x 13 x 37 x 43 x 887
**************************************************
Input a number: 9080706050403020100
Result: 9080706050403020100 = 2^2 x 3^2 x 5^2 x 229 x 547 x 883 x 9277 x 9833
**************************************************
Input a number: 963258741254
Result: 963258741254 = 2 x 3001 x 160489627
**************************************************
Input a number:
雪    币: 92
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Dsh骗天 2011-3-19 19:09
3
0
唉,如果能够给出运行时间就好了
雪    币: 67
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
没有姓名 2011-3-20 12:34
4
0
给你一个大素数:5817641757166447951(63bits)
看看跑多长时间了
在我这里大概跑了1分钟。
WinXP+SP3
AMDX2 2.2GHz

看看POJ上的题目:
http://poj.org/problem?id=2447
时间限制是3秒。测试数据规模是2^62,相当。
呵呵,当然了,那里大部分人都是用概率多项式时间的算法。
雪    币: 433
活跃值: (45)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lilianjie 1 2011-3-21 18:16
5
0
2^64-1

=18446744073709551615
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ykcommit 2011-12-9 10:59
6
0
很好的用的代码啊,谢谢!
雪    币: 19
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Aipsa 2013-10-19 09:36
8
0
收藏了,备用.
雪    币: 10243
活跃值: (16482)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhczf 2013-10-19 12:38
9
0
我也来收藏一个啊,好东西啊
游客
登录 | 注册 方可回帖
返回