« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
|
公告 |
本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!
——既瑜 |
统计 |
blog名称:★既瑜★ 日志总数:183 评论数量:636 留言数量:-25 访问次数:1407474 建立时间:2005年3月12日 |
OICQ:215768265
njucs2001@hotmail.com
erichoo1982@gmail.com |
|
W3CHINA Blog首页 管理页面 写新日志 退出
[【技术文档】]用大数相乘算法实现求一个有小数位的数x的n次方 |
/****************************************//*程序 pku1001*//*作者: S.Klaus *//*日期:2005-7-5*//*调试:VC6*//****************************************
****************************************/
/*头函数 */#include<iostream.h>
#include<iomanip.h>#include<stdlib.h>#include<string.h>
#define max 10000/***************************************/int xn(char fnum[],int n);int fmul(char s1[],char s2[]);/***************************************/
char sum[max];char result[max];
/***************************************//*子函数计算两个数的乘积*/int fmul(char s1[],char s2[]){ int ls1,ls2;//用于存储长度,进位信息 int i=0,j,p,q,m; int k=0,flag; char mid[max]; //char sum[max]; ls1=strlen(s1); ls2=strlen(s2); //反向 j=ls1-1; while(j>=0) { mid[i++]=s1[j--]; } mid[i]=s1[ls1]; strcpy(s1,mid); i=0; j=ls2-1; while(j>=0) { mid[i++]=s2[j--]; } mid[i]=s2[ls2]; strcpy(s2,mid); // cout<<s1<<endl<<s2<<endl; //计算 for(i=0;i<max;i++) { sum[i]='0'; } i=j=k=0; flag=0; p=0;q=0; while(s2[i]!='\0') { flag=0; m=q; for(m=0;m<q;m++) { mid[m]='0'; } p=m; while(s1[j]!='\0') { k=(s1[j]-'0')*(s2[i]-'0'); mid[p]=(flag+k)%10+'0'; flag=(flag+k)/10; j++;p++; } if(flag!=0){mid[p++]=flag+'0';} mid[p]='\0'; flag=0; p=0;//*********************************************/ if(i==0) { while(mid[p]!='\0') { sum[p]=mid[p]; p++; } } else { while(mid[p]!='\0') { k=(sum[p]-'0')+(mid[p]-'0'); sum[p]=(k+flag)%10+'0'; flag=(k+flag)/10; p++; } if(flag!=0) { sum[p++]=flag+'0'; flag=0; } } j=0; i++;q++; } sum[p]='\0'; i=0;j=0; strcpy(mid,sum); p-=1; while(p>=0) { sum[j]=mid[p]; p--; j++; } sum[j]='\0'; return 0;}/***************************************/int xn(char fnum[],int n){ char s1[max]; int i; if(n==0) { strcpy(result,"1"); return 0; } for(i=0;i<max;i++) { result[i]='\0'; }
strcpy(result,fnum);
for(i=1;i<n;i++) { strcpy(s1,fnum); fmul(s1,result); strcpy(result,sum); } return 0;}/***************************************/
/***************************************//*主函数*/
int main(){ char s1[max],s2[6]; int i; /*******************/ int n,ln,ls; char ch; int m,j=0,fl[100]; char s[6]; char res[100][max]; /*******************/ m=0; for(i=0;i<100;i++) fl[i]=0; while(cin>>s2>>n) {
j=0; i=0; while(s2[i]!='\0') { if(s2[i]=='.') { ln=strlen(s2)-1-i; fl[m]=ln; } else { s[j++]=s2[i]; } i++; } s[j]='\0';
ln=ln*n; xn(s,n); ls=strlen(result); i=0; j=0;
while(result[i]!='\0') { if(i==(ls-ln)) { res[m][j++]='.'; res[m][j++]=result[i++]; } else { res[m][j++]=result[i++]; } } res[m][j]='\0'; m++; }
//去除多出的零 for(i=0;i<m;i++) { j=strlen(res[i])-1;
while(j!=0&&fl[i]!=0) { if(res[i][j]!='0') { if(res[i][j]=='.') res[i][j]='\0'; else res[i][j+1]='\0'; break; } j--; } j=0; while(res[i][j]!='\0') { if(res[i][j]!='0') { while(res[i][j]!='\0') { cout<<res[i][j++]; } cout<<endl; break; } j++; } }
return 0;}
|
阅读全文(3356) | 回复(0) | 编辑 | 精华 |
|