http://poj.org/problem?id=1001
高精度计算,大数处理
<span style="font-size:18px;">#include <stdio.h>
#include <string.h>
int main()
{
int a[150],b[150],c[150];
char base[10]; /*底数字符串*/
int exp; /*指数*/
int temp,flag,i,j,k,digit;
int baselast,alast,blast,clast;
while(scanf("%s %d",base,&exp)!=EOF)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
baselast = strlen(base) - 1; /*标记底数最后一个字符的下标*/
for(i = 0; base[i]!='\0' ; i++) /*标记小数点的下标*/
{
if(base[i] == '.')
{
break;
}
}
digit = baselast - i; /*计算小数点后的位数*/
for(j = i; base[j]!='\0'; j++) /*删除小数点*/
{
base[j] = base[j+1];
}
baselast--;
for(i = 0; i <= baselast/2; i++) /*底数字符串逆值*/
{
temp = base[i];
base[i] = base [baselast - i];
base[baselast - i] = temp;
}
for(i = 0; base[i]!='\0'; i++) /*底数字符串base[]转数字数组a[]*/
{
a[i] = base[i] - '0';
}
alast = baselast; /*标记数组a[]最后一个数字的下标*/
for(i = 0; i<=alast; i++)
{
b[i] = a[i];
}
blast = alast; /*标记数组b[]最后一个数字的下标*/
for(i = 1; i <= exp-1; i++) /*连续乘了指数减一次*/
{
for(j = 0; j <= blast; j++) /*模拟乘法运算*/
{
for(k = 0; k <= alast; k++)
{
c[j+k] += a[k]*b[j];
if(c[j+k] >=10) //进位处理
{
c[j+k+1] += c[j+k]/10;
c[j+k] %= 10;
}
}
}
j--;
k--;
if(c[k+j+1] != 0) /*标记数组c[]最后一个数字的下标*/
clast = alast + blast +1;
else
clast = alast + blast;
/*c[]再转移给b[]*/
for(j = 0; j <= clast; j++)
b[j] = c[j];
blast = clast;
/*清空c[]*/
memset(c,0,sizeof(c));
}
digit *= exp; /*计算最终结果里小数的位数*/
flag = 0;
for(i = digit - 1; i >= 0; i--) /*遍历小数位,检验0*/
{
if(b[i] != 0)
{
flag = 1;
break;
}
}
if(flag == 0) /*小数部分都为0*/
{
for(i = blast; i >= digit; i--)
printf("%d",b[i]);
printf("\n");
continue;
}
if((digit == blast)&&(b[blast] == 0)) /*非小数位有且只有一个0*/
printf(".");
else
{
for(i = blast; i >= digit; i--)
printf("%d",b[i]);
printf(".");
}
for(i = 0;i <= digit -1; i++) /*去掉“前导0”*/
{
if(b[i] != 0)
{
temp = i;
break;
}
}
for(i = digit - 1; i >= temp; i--)
printf("%d",b[i]);
printf("\n");
}
return 0;
}
</span>