正文

求幂2007-06-30 22:26:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/27245.html

分享到:

输入:有多组测试数据,每行输入非负浮点数a和非负整数n,其中a固定长度为6个字符,且n小于100输出:计算a的n次方的结果,特别注意,如果结果小于1大于0,请不要输出前导0样例输入:95.123 120.4321 205.1234 156.7592  998.999 101.0100 12000002 32样例输出:548815620517731830194541.899025343415715973535967221869852721.0000000514855464107695612199451127676715483848176020072635120383542976301346240143992025569.92857370126648804114665499331870370751166629547672049395302429448126.76412102161816443020690903717327667290429072743629540498.1075960194566517745610440100011.1268250301319697206612014294967296 // code 1 #include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 800 char result[MAX]={0};int  pr = 1; int change(char *str){ char temp[10]; unsigned int k=0,i=0,j=0; if(str[0] == '0'){  for(i=1; str[i]=='0'; i++)   ;  if(str[i] != '.'){   for(k=0; str[i] != '.'; i++,k++)    temp[k] = str[i];  }  else{   for(; str[i]=='0'; i++)    ;  }  j = strlen(str) - i - 1;  for(i++; i <= strlen(str); k++,i++)   temp[k] = str[i]; } else {  for(j=i=0; i <= strlen(str); i++){   if(str[i] != '.')    temp[j++] = str[i];  }  if(strchr(str,'.'))   j = strlen(str)-(strchr(str,'.')-str)-1;  else   j = 0; } strcpy(str,temp); return j;} void getFill(char *a,char *b,int ia,int ja,int ib,int jb,int tbool,int move){ int  r,m,n,s,j,t; char *stack;  m = a[ia] - 48; if( tbool ){  r = (jb - ib > ja - ia) ? (jb - ib) : (ja - ia);  stack = (char *)malloc(r + 4);    for(r = j = 0,s = jb; s >= ib; r ++,s --){   n = b[s] - 48;   stack[r] = (m * n + j) % 10;   j = (m * n + j) / 10;  }  if( j ){   stack[r] = j;   r ++;  }  for(r --; r >= 0; r --,pr ++)   result[pr] = stack[r];  free(stack);  for(move = move + pr; pr < move; pr ++)   result[pr] = '\0'; } else{   r = pr - move - 1;  for(s = jb,j = 0; s >= ib; r --,s --){   n = b[s] - 48;   t = m * n + j + result[r];   result[r] = t % 10;   j = t / 10;  }  for( ; j ; r -- ){   t = j + result[r];   result[r] = t % 10;   j = t / 10;  } } } int get(char *a,char *b,int ia,int ja,int ib,int jb,int t,int move){ int m,n,s,j;  if(ia == ja){  getFill(a,b,ia,ja,ib,jb,t,move);  return 1; } else if(ib == jb){  getFill(b,a,ib,jb,ia,ja,t,move);  return 1; } else{  m = (ja + ia) / 2;  n = (jb + ib) / 2;  s = ja - m;  j = jb - n;  get(a,b,ia,m,ib,n,t,s + j + move);    get(a,b,ia,m,n + 1,jb,0,s + move);  get(a,b,m + 1,ja,ib,n,0,j + move);  get(a,b,m + 1,ja,n + 1,jb,0,0 + move); } return 0;} int main(){ char str1[10],str2[MAX]; int  i,j,k,m,n; while(scanf("%s %d",str1,&j)!=EOF){  if(j==0){   printf("1\n");   continue;  }  k = change(str1)*j;  if(str1[0] == '0'){   printf("0\n");   continue;  }  strcpy(str2,str1);  for(i=1; i < j; i++){   pr = 1;   result[0] = '\0';   get(str1,str2,0,strlen(str1)-1,0,strlen(str2)-1,1,0);   n = (result[0] ? 0 : 1);   for(m = 0; n < pr; n++,m++)    str2[m] = result[n]+48;   str2[m] = '\0';  }  if(k == 0){   puts(str2);   continue;  }   k = strlen(str2)-k;  for(i=strlen(str2)-1; i >= k && str2[i] == '0'; i--)   ;  str2[i+1] = '\0';  if(i == k){   puts(str2);   continue;  }  if(k <= 0){   printf(".");   for(; k < 0; k++)    printf("0");   printf("%s",str2);  }  else {   for(i=0,j=strlen(str2); i < j; i++){    if(i == k)     printf(".");    printf("%c",str2[i]);   }  }  printf("\n"); } return 0;}   //code 2 #include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 800 int change(char *str){ char temp[10]; unsigned int k=0,i=0,j=0; if(str[0] == '0'){  for(i=1; str[i]=='0'; i++)   ;  if(str[i] != '.'){   for(k=0; str[i] != '.'; i++,k++)    temp[k] = str[i];  }  else{   for(; str[i]=='0'; i++)    ;  }  j = strlen(str) - i - 1;  for(i++; i <= strlen(str); k++,i++)   temp[k] = str[i]; } else {  for(j=i=0; i <= strlen(str); i++){   if(str[i] != '.')    temp[j++] = str[i];  }  if(strchr(str,'.'))   j = strlen(str)-(strchr(str,'.')-str)-1;  else   j = 0; } strcpy(str,temp); return j;} void get(char *str1,char *str2,int len1,int len2){ char    str[MAX];        int     i,j,r,rr,smallr,temp,low,high; memset(str,0,MAX); for(i=len1-1,smallr=r=MAX-1; i >= 0; i--,r--){  for(j=len2-1,rr=r,high=0; j >= 0; j--,rr--){    temp = (str1[i] - 48) *(str2[j] - 48);   low = temp % 10;   low = low + str[rr] + high;   high = low / 10;   low = low % 10;   if( smallr > rr )    smallr = rr;   str[rr] = low;   high = temp / 10 + high;  }  if( high > 0 ){   str[rr] = high;   smallr = rr;  }    } for(j=0,i=smallr; i < MAX; j++,i++)  str1[j] = str[i]+48; str1[j] = '\0';} int main(){ char str1[10],str2[MAX]; int  i,j,k; while(scanf("%s %d",str1,&j)!=EOF){  if(j==0){   printf("1\n");   continue;  }  k = change(str1)*j;  if(str1[0] == '0'){   printf("0\n");   continue;  }  strcpy(str2,str1);  for(i=1; i < j; i++)   get(str2,str1,strlen(str2),strlen(str1));  if(k == 0){   puts(str2);   continue;  }   k = strlen(str2)-k;  for(i=strlen(str2)-1; i >= k && str2[i] == '0'; i--)   ;  str2[i+1] = '\0';  if(i == k){   puts(str2);   continue;  }  if(k <= 0){   printf(".");   for(; k < 0; k++)    printf("0");   printf("%s",str2);  }  else {   for(i=0,j=strlen(str2); i < j; i++){    if(i == k)     printf(".");    printf("%c",str2[i]);   }  }  printf("\n"); } return 0;}

阅读(2916) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册