UVA 748 (暑假-高精度-C-Exponentiation)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int Max = 1000;

int main () {
	char str_1[Max];// str_2[Max];
	memset(str_1, 0, 1000);
//	memset(str_2, 0, 1000);
	int n;


	while (scanf("%s%d", str_1, &n) != EOF) {
//		printf("%s %d\n", str_1, n);
		

		int kong = 0;
		int count = 0;
		int	s[2*Max] = {0};
		int arr_1[Max] = {0}, arr_2[Max] = {0};
		int len_1 = strlen(str_1);
//		int len_2 = strlen(str_2);
		int i, j, m;
		for (i = 0,j = 0; i < len_1; i++)   //?????,???????
			if ( str_1[len_1 - i - 1] == '.')
				kong = i; //printf("i = %d\n", i);
			else
				arr_1[j++] = str_1[len_1 - i - 1] - '0', arr_2[j-1] = arr_1[j-1];//, printf("%d",arr_2[j-1]);
//		printf("\nkong = %d\n", kong);
		kong = kong * n;
//		printf("\nkong = %d\n", kong);
//		for (int j = 0; j < len_2; j++)
//			arr_2[j] = str_2[len_2 - j - 1] - '0'; 

	for (m = 1; m < n; m++) {
		for (i = 0; i < Max; i++)    //??
			for (j = 0; j < Max; j++) {
				s[i+j]	= s[i+j] + arr_1[i] * arr_2[j];
					if (s[i+j] >= 10) {
						s[i+j+1] += s[i+j] / 10;
						s[i+j] = s[i+j] % 10; 
					}	
			}
				//?s[]??????arr_1; 
		for (i = 0; i < Max; i++)
			arr_1[i] = s[i], s[i] = 0;
	}
		//????
	if (n == 0)             //ÊÇ·ñÊÇ 0´Î·½
		printf("1");
	else
		if (atof(str_1) == 0)    //ÊÇ·ñ Êý×ÖÊÇ 0
			printf("0");
		else 
			if (atof(str_1) == (int) atof(str_1))   //ÊÇ·ñÊÇÕûÊý
			{
				if (kong == 0)                    //ÊÇ·ñÓÐСÊýµã
				{
					for (i = Max - 1; i >= 0 ; i--) 
						if (arr_1[i] != 0)
							break;
					for (; i >= 0; i--) 
						printf("%d", arr_1[i]);
				}
				else
				{
						for (i = Max - 1; i >= 0 ; i--) 
						{
							if (i == kong-1)
								printf(".");
							if (i < kong-1)
								printf("0");
							if (arr_1[i] != 0)
								break;
						}
						for (j=0; i >= j; i--)
						{
							printf("%d", arr_1[i]);
							if ( kong == i)
								break;
						}
				}
			}
			else 
			{
				for (i = Max - 1; i >= 0 ; i--)
				{
					if (i == kong-1)
						printf(".");
					if (i < kong-1)
						printf("0");
					if (arr_1[i] != 0)
						break;
				}
				j = 0;
				while (arr_1[j++] == 0)
				{;}
			
				for (; i >= j-1; i--) 
				{
					printf("%d", arr_1[i]);
					if ( kong == i)
						printf(".");
				}
			}
	
	memset(str_1, 0, 1000);
	//		memset(str_2, 0, 1000);
	printf("\n");

	}
	return 0;
}


/*

   int main() {
   float n;
   int m;
   char s[7];

   while (scanf("%s%d", s, &m) != EOF ) {
   printf("%s %d\n", s, m);




   }
   return 0;
   }
   */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰阔落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值