计算2的n次方,这个n过大也不行,我试过,2的20000次方还可以,再大就会出问题了。。
次方的数量级增长实在是很快。。没办法。。
以下是我的程序。。
#include
#include
#include
#define N 20000//最大位数。
。
void Add (char *ch1 , char *ch2 , char *ch3)
{// ch3 = ch1 ch2;
int len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , i , tmp , num1[N] , num2[N] , num3[N];
memset (num1 , 0 , sizeof(num1));
memset (num2 , 0 , sizeof(num2));
memset (num3 , 0 , sizeof(num3));
for (i=len1-1;i>=0;i--) num1[len1-1-i] = ch1[i] - 48; for (i=len2-1;i>=0;i--) num2[len2-1-i] = ch2[i] - 48;
i = 0 , tmp = 0 , len3 = len1 > len2 ? len1 : len2;
while (i = 10) { tmp = num3[i]/10; num3[i] %= 10; }
i ;
}
if (tmp != 0) { num3[i] = tmp; i ; }
len3 = i;
for (i=len3-1;i>=0;i--) ch3[len3-1-i] = num3[i] 48;
ch3[len3] = ' ';
return ;
}
void Minus (char *ch1 , char *ch2 , char *ch3)
{ // 保证 ch1 > ch2 : ch3 = ch1 - ch2
int i , tmp , len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , num1[N] , num2[N] , num3[N];
memset (num1 , 0 , sizeof(num1));
memset (num2 , 0 , sizeof(num2));
memset (num3 , 0 , sizeof(num3));
for (i=0;i len2 ? len1 : len2;
while (i 1 && num3[len3-1] == 0) len3 --;
for (i=0;i=0;i--) num1[len1-1-i] = ch1[i] - 48; for (i=len2-1;i>=0;i--) num2[len2-1-i] = ch2[i] - 48;
for (i=0;i= 10) { tmp = num3[i j]/10; num3[i j] %= 10; }
}
while (tmp != 0) { num3[i j] = tmp; tmp = num3[i j]/10; j ; }
}
len3 = len1 len2;
while (len3 > 1 && num3[len3-1] == 0) len3 --;
for (i=0;i ch2 return 1; ch1 len2) return 1;
if (len2 > len1) return -1;
for (i=0;i ch2[i]) return 1;
if (ch1[i] < ch2[i]) return -1;
}
return 0;
}
int main()
{
char p[N], q[N];
char n[N] = "";
char j[N], i[N] = "1";
char temp[N], result[N] = "1";
printf("计算p与q的乘积:
");
printf("p = ");
gets(p);
printf("q = ");
gets(q);
MUL(p, q, n);
printf("n = p*q = %s
", n);
printf("
");
printf("计算2的n次方减1:
");
printf("n = ");
gets(n);
for ( ; cmp(i, n) != 1; Add(j, "1", i))
{
strcpy(temp, result);
MUL(temp, "2", result);
strcpy(j, i);
}
strcpy(temp, result);
Minus(temp, "1", result);
printf("2^n-1 = %s
", result);
getch();
return (0);
}。
全部