正文

求幂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 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12
000002 32

样例输出:
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
4294967296

// 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;
}

阅读(2798) | 评论(0)


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

评论

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