Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

一点心得(附代码)

Posted by taesimple at 2011-08-04 15:59:55 on Problem 1001
记输入的浮点数其小数点后位数为n,末尾无效0位数为m,譬如12.100,则n=3,m=2。按以上定义,进行r次幂后,n' = n*r, m' = m*r。输出时,n'的值用于确定小数点位置,m'的值用于避免输出无效0,以及判断整数(整数条件为n ==m)
代码如下:
#include <stdio.h>
#include <string.h>
#include <math.h>
#define SIZE 130
int main(){
	int a[SIZE];  //99999^25约为10^124,因此用大小为130的数组表示计算结果
	char str[10];
	int r, n, cf;
	int k;
	int zero_cnt;  //记录尾部无效0个数
	while(EOF != scanf("%s%d", str, &r)){
		for(int i = 0; i < SIZE; i++) 
			a[i] = 0;
		zero_cnt = 0;
		for(int i = 5; str[i] != '.' && i >= 0; i--){  //计算zero_cnt
			if(str[i] == '0'){
				zero_cnt++;
			}
			else break;
		}
		int pos = strchr(str, '.')-str;  //pos为字符串中小数点的位置索引,5-pos即为小数位数
		for(int i = pos; i <= 5; i++)  //移除小数点,转为整数进行幂计算
			str[i] = str[i+1];
		sscanf(str, "%d", &n);
		for(int nn = n, i = 0; nn != 0; i++){
			a[i] = nn%10;
			nn /= 10;
		}
		for(int i = 0; i < r-1; i++){
			cf = 0;
			for(int j = 0; j < SIZE-1; j++){
				a[j] = a[j]*n + cf;
				cf = a[j]/10;
				a[j] %= 10;
			}
		}
		for(k = SIZE-1; k >= 0; k--)  //避免输出前导0
			if(a[k] != 0) break;
		for(int i = k; i >= r*(5-pos); i--) //输出整数部分
			printf("%d", a[i]);
		if(zero_cnt < 5-pos) //判断是否为整数
			printf(".");
		for(int i = r*(5-pos)-1; i >= r*zero_cnt; i--) //输出小数部分
			printf("%d", a[i]);
		printf("\n");
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator