输入:有多组测试数据,每行输入非负浮点数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;}

评论