?? 1001.cpp
字號:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Len 200
char r[2*Len-1];
//大整數乘法:輸入兩個數字串,返回一個結果串(去除前導0的)
void lnmp(char *cs,char *bcs)
{
char cjr[Len][Len][2];
int i,j,k,l,cslen,bcslen,rlen,jw=0,temp,out=0;
cslen=strlen(cs);
bcslen=strlen(bcs);
rlen=cslen+bcslen-1;
//生成矩形表(三維數組)
for(i=cslen-1;i>=0;i--)
for(j=bcslen-1;j>=0;j--)
{
temp=(cs[i]-'0')*(bcs[j]-'0');
cjr[j][i][0]=temp/10;
cjr[j][i][1]=temp%10;
}
//求出結果(注意一個規律性的東西,從最后一位到最前一位,為矩形表里頭的下標遞減的數字之和)
for(l=rlen;l>=0;l--)
{
temp=jw;
for(i=cslen-1;i>=0;i--)
for(j=bcslen-1;j>=0;j--)
for(k=1;k>=0;k--)
if(l==i+j+k) temp=temp+cjr[j][i][k];
jw=temp/10;
r[l]=temp%10+'0';
}
for(l=0;l<rlen;l++) if(r[l]!='0') break;
if(l) for(i=l;i<=rlen+1;i++) r[i-l]=r[i];
}
int main()
{
char R[Len];
int N;
int i,j,k,xsdws,temp,flag;
while(scanf("%s %d",R,&N)!=EOF)
{
i=1,flag=0;
temp=strlen(r);
for(i=0;i<temp;i++) r[i]='\0';
//求小數點的位置
temp=strlen(R);
for(i=0;i<temp;i++)
if(R[i]=='.') break;
//如果是小數,先轉換成整數,后面再轉換回來
if(i!=temp)
{
flag=1;
xsdws=(temp-i-1)*N;
for(j=i;j<=temp;j++)
R[j]=R[j+1];
}
//去除前導零,減少不必要的計算次數
for(i=0;i<temp;i++) if(R[i]!='0') break;
if(i) for(j=i;j<=temp;j++) R[j-i]=R[j];
strcpy(r,R);
for(i=1;i<N;i++)
lnmp(r,R);
temp=strlen(r);
//如果是整數,直接輸出結果,否則要考慮幾種情況
if(!flag)
{
for(j=0;j<temp;j++)
putchar(r[j]);
}
//為小數時,需要考慮去掉末尾無效的零,如果位數不夠,需要補充零,下面將出示比較典型的例子
else
{
i=temp-xsdws;
if(temp>xsdws)
{
i=temp-xsdws;
for(j=0;j<i;j++) putchar(r[j]);
for(k=temp-1;k>=0;k--) if(r[k]!='0') break;
if(i<=k) putchar('.');
for(j=i;j<k+1;j++) putchar(r[j]);
}
else
{
i=xsdws-temp;
putchar('.');
for(j=0;j<i;j++) putchar('0');
for(k=temp-1;k>=0;k--) if(r[k]!='0') break;
for(j=0;j<k+1;j++) putchar(r[j]);
}
}
putchar('\n');
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -