POJ 1001

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值