学习嵌入式的点滴(三)

  距离上次写博客又已经将近一个月了,发现自己写得真的有点慢……

  其实早在大一的时候就接触了,但是仅仅只是局限在使用cd ls 这2个超简单的命令,其他的一概不晓得,看着老师在讲台上把linux用的出神入化,那是各种羡慕嫉妒恨啊,现在想来他不过也是围绕着几个简单的命令敲而已。我拿起linux标准学习教程看了,像rm cp touch cat whatis whereis其实这些命令都是可以记住的,只是之前不知道要常用,积累下来。熟悉了一些命令我就直接找书上的代码抄了起来,抄的是linux的文件IO操作,linux里面的设备都是在/DEV里面有对应的文件的,然后通过读写这些文件来启动设备,主要的读写就是read()和writer()还有各种……,我吵了蛮多的代码,大多是一知半解的,我也没太在意,后来无意间看到《程序员面试宝典》,我仔细看那了,里面对于应届毕业生来说,主要要熟悉的是语言的基础知识,我之前抄代码,其实只是自己不知道应该做什么而已,看到这本书,我决定,好好的看看C语言。

  本来我看的C语言的书也有基本,最经典的是谭浩强的《C语言程序设计》《the c programming language》其实还有算法之类的,但是我看了就头晕,看书的时候觉得自己其实还是懂得蛮多的,但是当我用的时候,才发现自己好像好傻好天真。因为要练习C语言,所以找了北大的JUDEG ONLINE 的那个网站,因为我大一的时候曾经一度喜欢在这个网站上做题,那个时候什么都不懂,纯粹的C语言小白,老师开了一门C++,开始就跟我们讲什么学C++的话最好要会用C,我当时就晕了,心理在想:我要是晓得用C我还来让教个屁啊……老师让我们都那个网站上注册一个ID,多做点题目。大一的时候根本就没有电脑,但是在图书馆可以上网,而且只要1块钱一个小时,于是几乎一有时间就泡在图书馆编程,当然是从最开始的A+B program了,然后都是一些关于循环的问题,现在想来都不难,但是我重新登录那个网站的时候,花了近半个小时的时间试账号密码,还是找不到我大一的时候用的账号了,心理有点小小的失落,其实伴随账号密码忘记的好友很多C的语言的东西,我随意写一个程序的时候,我甚至scanf这样的函数,都不晓得怎么用了……

  那个网站的第一题是A+B,然后是一个求幂的程序,而我直接就载在了这个程序上,其实这程序也不难的的,只要知道了他的规律就很容易的知道做的,具体的题目我贴出来:

求高精度幂
Time Limit: 500MS Memory Limit: 10000K
Total Submissions: 101504 Accepted: 24399

Description

对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。

现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(R n),其中n 是整数并且 0 < n <= 25。

Input

T输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。

Output

对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。

Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12

Sample Output

548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

我的自己写的程序是:

#include<stdio.h>
#include<string.h>
#define MAX_LEN 200

int main()
{
	char *p;
	char num[MAX_LEN];
	int mul[MAX_LEN];
	int mul1[MAX_LEN];
	int result[MAX_LEN];
	int n, len, i, f, k, j, s;

	while(scanf("%6s %2d",num,&n) != EOF)
	{	
		if(n == 0)
		{
			printf("1\n");
		}
		else
		{
			p = num;
			len = strlen(num);
			memset(mul,0,sizeof(mul));
			memset(mul1,0,sizeof(mul1));
			int isinteger = 1; //定义是否为整数标志,为0表示不为整数
			/*判断是否为整数*/
			for(i = 0; i < len; i++)
			{
				if(num[i] == '.')
				{
					isinteger = 0;
					break;
				}
			}

			/*处理字符串*/
			if(isinteger)
			{
				/*去掉前面无意义的0*/
				for(i = 0; i < len; i++)
				{
					if(num[i] != '0')
					{
						p = num + i;
						break;
					}
				}

				strcpy(num,p);
				len = strlen(num);//去掉前面的0代表的位数


				/*字符串复制到数组*/
				i = 0;
				j = len -1;
				while(num[i] != '\0')
				{
					mul[j] = num[i] - '0';
					mul1[j] = num[i] - '0';
					j--;
					i++;
				}
				memset(result,0,sizeof(result));

				f = len;
				for(s = 1; s < n; s++)
				{
					for(j = 0; j < f; j++)
					{
						for(k = 0; k < len; k++)
						{
							result[j+k] +=	mul1[j] * mul[k];
						}
					}

					f = k + j + 1 - 2 + 1;

					for(j = 0; j < f; j++)
					{
						mul1[j] = result[j];
					}

					for(i = 0; i < f; i++)
					{
						if(mul1[i] >= 10)
						{
							mul1[i+1] += mul1[i]/10;
							mul1[i] %= 10; 
						}
					}
					memset(result,0,sizeof(result));
				}

				int sfrag = 0;
				j = 0;
				for(i = (f - 1); i >= 0; i--)
				{
					if(sfrag)
					{
						result[j++] = mul1[i];
					}
					else if(mul1[i] != 0)
					{
						sfrag = 1;
						result[j++] = mul1[i];
					}
				}

				/*输出*/
				for(i = 0; i < j;i ++)
				{
					printf("%d",result[i]);
				}
				printf("\n");
			}
			else
				/*是小数*/
			{
				for(i = 0; i < len; i++)
				{
					if(num[i] != '0')
					{
						p = num + i;
						break;
					}
				}
				strcpy(num,p);
				len = strlen(num);

				/*去掉小数点后面无意义的0*/
				for(i = (len-1); i >= 0; i--)
				{
					if(num[i] != '0' ||num[i] == '.' )
					{
						break;
					}
					else
					{
						len -= 1;
					}
				}


				j = len - 2;//去掉小数点
				i = 0;
				int pfrag = 0;
				while(num[i] != '\0')
				{
					if(num[i] != '.')
					{
						mul[j] = num[i] - '0';
						mul1[j] = num[i] - '0';
						j--;
					}
					else
					{
						pfrag = i;
					}
					i++;
				}
				len -= 1;//去掉小数点的长度
				pfrag = n * (len - pfrag);
				memset(result,0,sizeof(result));

				f = len;
				for(s = 1; s < n; s++)
				{
					for(j = 0; j < f; j++)
					{
						for(k = 0; k < len; k++)
						{
							result[j+k] +=	mul1[j] * mul[k];
						}
					}

					f = k + j + 1 - 2 + 1;

					for(j = 0; j < f; j++)
					{
						mul1[j] = result[j];
					}

					for(i = 0; i < f; i++)
					{
						if(mul1[i] >= 10)
						{
							mul1[i+1] += mul1[i]/10;
							mul1[i] %= 10; 
						}
					}


					memset(result,0,sizeof(result));
				}

				int sfrag = 0;
				j = 0;
				for(i = (f - 1); i >= 0; i--)
				{
					if(sfrag)
					{
						result[j++] = mul1[i];
					}
					else if(mul1[i] != 0)
					{
						sfrag = 1;
						result[j++] = mul1[i];
					}
				}

				if(pfrag >= j)
				{
					printf(".");
					for(i = 0; i < (pfrag - j); i++)
					{
						printf("0");
					}
					for(i = 0; i < j;i ++)
					{
						printf("%d",result[i]);
					}
					printf("\n");
				}
				else if(pfrag < j)
				{
					for(i = 0; i < (j-pfrag); i++)
					{
						printf("%d",result[i]);
					}
					printf(".");
					for(i = (j - pfrag); i < j; i++)
					{
						printf("%d",result[i]);
					}
					printf("\n");
				}
			}
		}
	}	
	return 0;
}


 程序最终能够成功运行,但是我提交的时候却是WRONG ANSWER,我也不晓得自己是哪里出了问题,这就是一个人在judgeonline上做题目的坏处,自己在哪里错了,往往自己是很难找出来的,其实在写
这个程序的时候是遇到了很多的问题的但是后来仔细想想,这些问题都是有规律的,做这样一个题其实应该很快的,但是我却花了很长时间。。可能是时间不连贯的原因吧,我这个程序存在很大的问题,很
多东西都应该写成函数的,但是我一股脑的写完了,也懒得去管了。。。。。呵呵,哎,这个程序总是WRANGANSWER,我就纠结了。。。想想也觉得任重而道远啊。。

转载于:https://www.cnblogs.com/dszhazha/archive/2012/05/01/Exponentiation.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值