/*
* poj_1001.c
* accepted.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE (125)
#define ITEM_SIZE (10)
static char item[ITEM_SIZE][SIZE];
static char * poj_1001(char dst[], char src[], int src_width, int n);
static char * move_leftward (char dst[], char src[], int n);
static char * add_to(char dst[], char src[]);
int main(int argc, char* argv[]){
int i,j,m,n,b;
int point;
char number[5];
char buf[SIZE];
char str_temp[7];
int n_temp;
while(2 == scanf("%s%d", str_temp, &n_temp)){
point = 0;
for(i=0,j=0; i<6; i++){
if(str_temp[i] != '.'){
number[j++] = str_temp[i];
}
else{
point = i;
}
}
point = 5 - point;
point = n_temp * point;
point = SIZE - point -1;
poj_1001(buf,number,5,n_temp);
m=0;
n=SIZE-1;
for (i=0;i<SIZE;i++){
if ( '0' != buf[i] ){
m = i;
break;
}
}
for (i=SIZE-1; i>=0; i--){
if ( '0' != buf[i] ){
n = i;
break;
}
}
b=1;
for (i=0;i<SIZE;i++){
if('0' != buf[i]){
b=0;
}
}
if (b){
printf("0");
}
else {
if (m>point){
printf(".");
for (i=point+1; i<=n; i++){
printf ("%c", buf[i]);
}
}
else if (m<=point && point<n){
for (i=m;i<=point;i++){
printf ("%c", buf[i]);
}
printf (".");
for (i=point+1;i<=n;i++){
printf ("%c", buf[i]);
}
}
else{
for (i=m;i<=point;i++){
printf ("%c", buf[i]);
}
}
}
printf ("\n");
}
return 0;
}
static char * poj_1001 (char dst[], char src[], int src_width, int n){
int i,j,k;
int carry, bitsum;
char buf[SIZE];
char aux[SIZE];
memset(item, '0', ITEM_SIZE*SIZE);
memcpy(item[1]+SIZE-src_width, src, src_width);
bitsum = 0;
for (i=2;i<=9;i++){
carry = 0;
for (j=SIZE-1; j>=0; j--){
k = j - (SIZE - src_width);
if (0<=k){
bitsum = i * (src[k] - '0') + carry;
item[i][j] = '0' + (bitsum % 10);
carry = bitsum / 10;
}
else{
item[i][j] = '0' + carry;
break;
}
}
}
if (0 == n){
memset (dst, '0', SIZE);
memset (dst + SIZE - 1, '1', 1);
}
else if (1 == n){
memcpy (dst, item[1], SIZE);
}
else{
memcpy (dst, item[1], SIZE);
for (i=0; i<n-1; i++){
memset (aux, '0', SIZE);
for (j=0; j<SIZE; j++){
move_leftward (buf, item[dst[j]-'0'], SIZE-1-j);
add_to (aux, buf);
}
memcpy (dst, aux, SIZE);
}
}
return dst;
}
static char * add_to (char dst[], char src[]){
int carry, bitsum;
int i;
carry = 0;
bitsum = 0;
for (i=SIZE-1; i>=0; i--){
bitsum = carry + (dst[i] - '0') + (src[i] - '0');
dst[i] = ('0' + bitsum % 10);
carry = bitsum / 10;
}
return dst;
}
static char * move_leftward (char dst[], char src[], int n){
int i;
int tail;
tail = SIZE-1-n;
memset (dst, '0', SIZE);
for (i=0; i<=tail; i++){
dst[i] = src[i+n];
}
return dst;
}
C++用类来实现的
/*
* C++
* poj_1001.cpp
* accepted
*/
#include <cstdio>
#include <cstring>
#include <assert.h>
#include <stdlib.h>
const int BUFFER_SIZE = 125;
const int LINE_SIZE = 10;
const int NUMBER_WIDTH = 6;
class Number;
class Number{
public:
Number(){
int i;
for(i=0;i<BUFFER_SIZE;i++){
set_data_at(i, '0');
}
set_float_point(BUFFER_SIZE-1);
}
Number(char* str){
int n_fp = BUFFER_SIZE-1;
int i,j;
char *p = str;
int n_str_len;
//int n_str_point; /* str中小数点在第n_str_point字符之后,假设从1开始*/
n_str_len = 0;
while('\0' != *p){
p++;
n_str_len++;
}
p--;
j=0;
//n_str_point = 0;
char *q = p;
while(q!=str){
if('0' == *q){
j++;
}
else{
break;
}
q--;
}
/*
* 只拷贝从str至q指向的字符,并抹去之间的小数点
*/
i=BUFFER_SIZE-1;
p=q;
int fixed = 0;
while(p!=str){
if('.' != *p){
set_data_at(i,*p);
i--;
if(!fixed){
n_fp--;
}
}
else{
fixed = 1;
}
p--;
}
set_data_at(i,*p);
for(j=i-1;j>=0;j--){
set_data_at(j,'0');
}
set_float_point(n_fp);
/*for(i=0;i<BUFFER_SIZE;i++){
printf("%c",get_data_at(i));
}
puts("");*/
}
Number operator * (int v){
Number n_ret;
if( 0 == v){
return n_ret;
}
else{
int i;
int carry = 0;
int temp;
int digit;
for(i=BUFFER_SIZE-1;i>=0;i--){
temp = (get_data_at(i) - '0') * v + carry;
digit = temp % 10;
carry = temp / 10;
n_ret.set_data_at(i,(char)(digit + '0'));
}
n_ret.set_float_point(get_float_point());
return n_ret;
}
}
/*
* 返回将小数点向右移动一些为数的结果
*/
Number operator >> (int n_move_right_ward){
int i;
int n_fp = get_float_point();
Number n_ret = (*this);
if(n_fp + n_move_right_ward < BUFFER_SIZE){
n_ret.set_float_point(n_fp + n_move_right_ward);
}
else{
int n_blank_to_add = n_move_right_ward - (BUFFER_SIZE-1 - n_fp);
n_ret.set_float_point(BUFFER_SIZE -1 );
for(i=0; i<BUFFER_SIZE-n_blank_to_add;i++){
n_ret.set_data_at(i,get_data_at(i+n_blank_to_add));
}
for(;i<BUFFER_SIZE;i++){
n_ret.set_data_at(i,'0');
}
}
return n_ret;
}
Number operator * (Number n_2){
/*
* 将n_2的各位分别与第一个操作数相乘
*/
Number n_ret, n_temp, n_temp_2;
int i,j;
int n_fp_2 = n_2.get_float_point();
int n_move_right;
for(i=0;i<BUFFER_SIZE;i++){
if('0' != n_2.get_data_at(i)){
n_move_right = n_fp_2 - i;
n_temp = (*this)>>n_move_right;
n_temp_2 = n_temp * (n_2.get_data_at(i) - '0');
n_ret = n_ret + n_temp_2;
}
}
return n_ret;
}
Number operator + (const Number& b_number){
int f_p=get_float_point();
int f_p_b=b_number.get_float_point();
int f_p_small;
Number n_small;
int f_p_big;
Number n_big;
/*
* n_small has longer float number than n_big
*/
if(f_p < f_p_b){
n_small = *this;
f_p_small = f_p;
n_big = b_number;
f_p_big = f_p_b;
}
else{
n_small = b_number;
f_p_small = f_p_b;
n_big = *this;
f_p_big = f_p;
}
Number n_ret;
int i,j,k;
int c=0; // 当前是否进位
int digit; //当前位运算的结果
/*
* 较多余的小数部分
*/
int longer_floating = f_p_big - f_p_small;
/*
* copy
*/
for(k=BUFFER_SIZE-1; k>=0; k--){
if(k>BUFFER_SIZE - 1 - (f_p_big - f_p_small)){
n_ret.set_data_at(k, n_small.get_data_at(k));
}
else{
i=k;
j=k + (f_p_big - f_p_small);
int temp = n_small.get_data_at(i) - '0' + n_big.get_data_at(j) - '0';
temp = temp + c;
digit = temp % 10;
c = temp / 10;
n_ret.set_data_at(k, (char)('0' + digit));
}
}
for(i=0,j=0;i<BUFFER_SIZE;i++){
if('0'==n_ret.get_data_at(BUFFER_SIZE-1-i) && BUFFER_SIZE-1-i>f_p_small){
j++;
}
else{
break;
}
}
/*
* delete 尾部多余的零(小数点之后的)
*/
if(j){
for(i=BUFFER_SIZE-1;i>j-1;i--){
n_ret.set_data_at(i,n_ret.get_data_at(i-j));
}
f_p_small += j;
}
n_ret.set_float_point(f_p_small);
return n_ret;
}
void set_float_point(int p){
float_point = p;
}
int get_float_point()const{
return float_point;
}
char get_data_at(int p)const{
return (char)(data[p]);
}
void set_data_at(int p, char ch){
data[p] = ch;
}
/*
* return the index of the first character that is not '0', otherwise return -1
*/
int get_index_of_1st_non_zero_symbol()const{
for(int i=0; i<BUFFER_SIZE; i++){
if( '0' != get_data_at(i)){
return i;
}
}
return -1;
}
Number& operator = ( Number b){
if(this != &b){
set_float_point(b.get_float_point());
for(int i=0;i<BUFFER_SIZE;i++){
set_data_at(i,b.get_data_at(i));
}
}
return *this;
}
Number operator ^ ( int v){
Number n_ret;
if(v == 0){
n_ret.set_data_at(BUFFER_SIZE-1,'1');
return n_ret;
}
n_ret = *this;
int i;
for(i = 1; i<v; i++){
n_ret = n_ret * (*this);
}
return n_ret;
}
void print(){
/*
* 从第一个有效数字开始打印,遇到小数点时停顿并打印小数点,然后打印至最后并截去末尾多余的零
*/
int f_p = get_float_point();
int i;
int n_tail_zeros = 0;
for(i = BUFFER_SIZE-1; i>f_p;i--){
if('0' == get_data_at(i)){
n_tail_zeros ++;
}
else{
break;
}
}
/*
* 打印的字符中最大的Index
*/
int n_max_print_index = BUFFER_SIZE - 1 - n_tail_zeros;
/*
* 统计左端开始连续的0的个数
*/
int n_head_zeros = 0;
for(i=0; i<BUFFER_SIZE;i++){
if('0' == get_data_at(i)){
n_head_zeros ++;
}
else{
break;
}
}
int n_min_print_index = n_head_zeros;
/*
* 如果小数点左端位数少于左端连续0的个数,则不打印小数点左端的0,
*/
char *p_str_show = str_show;
if(n_head_zeros > 1 + f_p){
//printf(".");
sprintf(p_str_show, ".");
p_str_show++;
}
/*
* 从第一个有效数字的index处开始打印
*/
else{
for(i=n_min_print_index;i<=f_p;i++){
//printf("%c",get_data_at(i));
sprintf(p_str_show,"%c",get_data_at(i));
p_str_show++;
}
//printf(".");
sprintf(p_str_show,".");
p_str_show++;
}
for(i=f_p+1;i<=n_max_print_index;i++){
//printf("%c",get_data_at(i));
sprintf(p_str_show,"%c",get_data_at(i));
p_str_show++;
}
sprintf(p_str_show, "%c", '\0');
//printf(" %d\n", get_float_point());
}
char* get_str_show(){
print();
return str_show;
}
private:
char data[BUFFER_SIZE]; // right alignment, for example 12345 is stored as 000000...0000012345 with float point is stored as 124.
char str_show[BUFFER_SIZE+2]; // to display, including dot
int float_point;
};
int main( int argc, char* argv[]){
int i,j;
char buf[1+NUMBER_WIDTH];
char buf_aux[BUFFER_SIZE+2];
char *t_ch;
int n_exp;
i=0;
j=0;
while( 2 == scanf("%s%d", buf, &n_exp)){
Number n_1(buf);
Number n_2;
n_2 = n_1 ^ n_exp;
strcpy (buf_aux, n_2.get_str_show ());
t_ch = buf_aux;
while(*t_ch){
t_ch++;
}
t_ch--;
if(*t_ch == '.'){
*t_ch = '\0';
}
printf("%s\n",buf_aux);
}
return 0;
}