大模拟,刷夜系列第一题,从12点做到两点,WA2次,与标程对拍得过。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <climits>
#include <cassert>
#include <algorithm>
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
const double pai = 3.14159265358979323846;
typedef long long ll;
char in[500];
int len, len2, pflag;
int narr[100117], mir[500], tn[100117];
void init(){
len = len2 = 0;
memset(narr, 0, sizeof(narr));
memset(in, 0, sizeof(in));
memset(mir, 0, sizeof(mir));
// memset(tn, 0, sizeof(tn));
return ;
}
void bmutiply(){
int i, j, k, dn, d;
memset(tn, 0, sizeof(tn));
for(i = 0; i < len; i++){
k = i;
for(j = 0; j < len2; j++){
tn[k++] += narr[j] * mir[i];
}
}
dn = (len + 1) * (len2 + 1);
for(i = 0; i < dn; i++){
d = tn[i] - (tn[i] % 10);
tn[i] = tn[i] % 10;
tn[i + 1] = tn[i + 1] + d / 10;
}
for(i = dn; i >= 0; i--){
if(tn[i] != 0){
len2 = i + 1;
break;
}
}
for(i = 0; i < len2; i++){
narr[i] = tn[i];
}
// for(i = len2 - 1; i >= 0; i--){
// printf("%d", narr[i]);
// }
// printf("\n");
return ;
}
int main(){
//#ifndef ONLINE_JUDGE
// freopen("in.in", "r", stdin);
// freopen("output", "w", stdout);
//#endif // ONLINE_JUDGE
int i, j, k, n;
while(scanf("%s", in) != EOF){
scanf("%d", &n);
// cout << endl;
len = len2 = 0;
len = strlen(in);
for(i = len - 1; i >= 0; i--){
if(in[i] != '0'){
in[i + 1] = '\0';
break;
}
}
len = strlen(in);
for(i = 0; i < len; i++){
if(in[i] != '0'){
break;
}
}
int kk;
kk = i;
// cout << kk << endl;
for(i = 0; i < len; i++){
in[i] = in[i + kk];
}
in[len - kk] = '\0';
len = strlen(in);
if(len == '\0'){
in[0] = '0';
in[1] = '\0';
len = 1;
}
else if(in[0] == '.' && strlen(in) == 1){
in[0] = '0';
in[1] = '\0';
}
// puts(in);
if(n == 0){
if(!(strlen(in) == 1 && in[0] == '0')){
puts("1");
}
else{
puts("0");
}
init();
continue;
}
// if(n == 1){
// puts(in);
// init();
// continue;
// }
k = 0;
pflag = -1;
// cout << len << endl;
j = 0;
for(i = len - 1; i >= 0; i--){
++j;
if(in[i] != '.'){
mir[k] = narr[k] = in[i] - '0';
k += 1;
}
else{
pflag = j - 1;
continue;
}
}
if(pflag != -1){
len--;
}
len2 = len;
// cout << len << endl;
// cout << pflag << endl;
// puts(in);
// for(i = 0; i < len; i++){
// cout << mir[i] ;
// }
// cout << endl;
for(i = 1; i < n; i++){
bmutiply();
}
j = 0;
// cout << pflag << endl;
pflag = pflag * n;
// cout << pflag << endl;
// cout << len2 << endl;
int flag = 0;
if(pflag > len2){
flag = 1;
printf(".");
if(flag == 1){
for(i = 0; i < pflag - len2; i++){
printf("0");
}
}
}
else if(pflag == len2){
if(flag == 0){
printf(".");
flag = 1;
}
}
for(i = len2 - 1; i >= 0; i--){
if(j == len2 - pflag && flag == 0){
printf(".");
}
j++;
printf("%d", narr[i]);
}
printf("\n");
init();
}
return 0;
}