user-0 提问: 疯狂编程

回复:
user: user-1
content: #include <iostream>  #define NUM 1000 //可显示的位数  void main() { 	char power[NUM]; 	memset(power, 0, NUM);//清空存储答案的数组值 	power[0] = 1; 	int cha = 0;//用于进位 	for (int i = 0; i < 100000; i++)//十万次方 	{ 		for (int j = 0; j < NUM; j++) 		{ 			power[j] *= 2;//每一位乘以2 			power[j] += cha;//进位 			if (power[j] >= 10) 			{ 				power[j] -= 10; 				cha = 1;//进位 			} 			else 				cha = 0; 			if (power[j] == 0 && cha == 0)//退出判断 				break; 		} 	} 	int len = 0; 	for (int i = NUM - 1; i >= 0; i--) 	{ 		if (power[i] != 0) 		{ 			len = i; 			break; 		} 	} 	std::cout << "2的十万次方："; 	for (int i = len; i >= 0; i--) 		std::cout <<(power[i] += '0');  	std::cout << std::endl; 	system("pause"); }

user: user-2
content: 1<<100000

user: user-3
content: 肯定溢出了，只是考一考脑子灵活性的话参考8楼

user: user-4
content: 2的十万次方的二进制表示只有一个"1"，大概主要是进制转换的问题....楼主考虑一下把整个算式取对数或者使劲开平方再算，楼主数学好的话可以上数论变换

user: user-5
content: 随手写的, 奇怪, 还是得差不多 30毫秒, 太慢了, 还是得用 gmp ..  不过 V8 的速度还真不错....  #include <stdio.h> #include <stdint.h> #include <time.h>  #ifdef _MSC_VER #pragma warning(disable: 4996) #endif  int j__mul(uint64_t* a, int L__a, uint64_t *b, int L__b, uint64_t *result) { 	int i, j, L__result = L__a + L__b; 	for (i = 0; i < L__result; ++i) 		result[i] = 0; 	for (i = 0; i < L__a; ++i) 	{ 		for (j = 0; j < L__b; ++j) 			result[i + j] += a[i] * b[j]; 	} 	for (i = 1; i < L__result; ++i) 	{ 		result[i]     += result[i - 1] / 10000; 		result[i - 1] %= 10000; 	} 	if (0 == result[L__result - 1]) 		--L__result; 	return L__result; }  void foobar() { 	char s__result[100000], *s__p = s__result; 	uint64_t buf[3][10240] = { 0 }, *result = buf[0], *a = buf[1], *t = buf[2], *tt; 	int L__result = 1, L__a = 1; 	long tick_start = clock(), tick_calc, tick_output; 	int  b = 100000, i;  	result[0] = 1; 	a[0] = 2;  	while (1 != b) { 		if (b & 1) { 			L__result = j__mul(result, L__result, a, L__a, t); 			tt = result; result = t;  t = tt; 		}  		L__a = j__mul(a, L__a, a, L__a, t); 		tt = a;  a = t; t = tt; 		b >>= 1; 	} 	L__result = j__mul(result, L__result, a, L__a, t); 	result = t;  	tick_calc = clock(); 	s__p += sprintf(s__p, "%d", (int)result[L__result - 1]); 	for (i = L__result - 2; i >= 0; --i) 		s__p += sprintf(s__p, "%04d", (int)result[i]); 	printf("%s\n", s__result); 	tick_output = clock(); 	 	printf("tick %ld, %ld\n", tick_calc - tick_start, tick_output - tick_start);	 }  int main() { 	int i; 	for (i = 0; i < 10; ++i) 	{ 		foobar(); 	} 	getchar(); 	return 0; }

user: user-5
content: 试了下，　就是ｊｓ跑也就 １００来毫秒的事情，　Ｃ跑起来应该时间都很难测出来．  <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Title</title> </head> <body>  <script language="javascript">     function j__mul(a, b) {         var result = [], i, j;         result.length = a.length + b.length;         for(i = result.length - 1; i >= 0; --i)             result[i] = 0;         for(i = a.length - 1; i >= 0; --i) {             for(j = b.length - 1; j >= 0; --j) {                 result[i+j] += a[i] * b[j];             }         }          for(i = 1; i < result.length; ++i) {             result[i]   += result[i-1] / 10000 | 0;             result[i-1] %= 10000;         }          if(0 == result[result.length-1])             --result.length;         return result;     }      function j__pow(i__a, b) {         var start = new Date().getMilliseconds();         var result = [1], s__result = "";         var a = [i__a], i;          if(b <= 0)             return 1;          while(1 != b) {             if(0 != (b&1))                 result = j__mul(result, a);              a = j__mul(a, a);             b >>= 1;         }          result = j__mul(result, a);         i = result.length - 1;          s__result += result[i];         while(--i >= 0) {             var s1 = "0000" + result[i];             s__result += s1.substring(s1.length - 4);         }         return (new Date().getMilliseconds() - start) + "  Len:" + s__result.length + "\n\n\n" + s__result;     }  </script> <button onclick="document.getElementById('result').innerText = j__pow(2, 100000)">2^100000</button> <textarea id="result" style="width: 100%; height: 600px;"></textarea>  </body> </html>

user: user-5
content: pow(2,N)  复杂度是　O(log(N)) 的，　不需要咋搞．

user: user-6
content: 大数存储考虑用数组来存

user: user-7
content: 引用 2 楼 GKatHere的回复:这不在次方的问题，在于数据长度的问题 那就用字符串存储吧..

user: user-8
content: 这不在次方的问题，在于数据长度的问题

user: user-9
content: 帮你移到了C语言版。

user: user-10
content: 用long double能表示不？

user: user-11
content: 2 的 十万次方是一个固定的数。

user: user-12
content: 用数组来存储就可以了。  请参考以下代码： #include<stdio.h> int main() {     static int a[100000000]; //设置一个超大数组来存储乘积结果。     int n;//要求的n的阶乘     int jw;//用来表示进位     int i, j;//控制循环     int len = 1;//初始化数组长度为1     int temp;//过程变量     printf("请输入n：");     scanf("%d", &n);     a[1] = 1;     for (i = 2; i <= n; i++)//遍历。从1到n     {         jw = 0;         for (j = 1; j <= len; j++)//从数组的低位开始乘         {             temp = a[j] * i + jw;//变量存储结果             a[j] = temp % 10;//将变量最后一位放入数组。             jw = temp / 10;//表示除了最后一位需要进位的数             if (j >= len && jw != 0)                 len++;  //数组长度加一          }       }          printf("n! =");          for (i = len; i >= 1; i--)//逆序输出数组就是结果         printf("%d", a[i]);     printf("\n");     return 0; }