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