• 学习嵌入式的点滴(三)


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

      其实早在大一的时候就接触了,但是仅仅只是局限在使用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 次方(Rn),其中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,我就纠结了。。。想想也觉得任重而道远啊。。

  • 相关阅读:
    client-go和golang源码中的技巧
    使用Prometheus监控snmp
    kubernetes client-go解析
    go 语言的一个赋值操作
    使用Prometheus监控bind9的DNS服务
    验证Prometheus alertmanager邮件发送
    JS 监听浏览器各个标签间的切换
    通过案例理解position:relative和position:absolute
    浏览器的统一指针事件:Pointer Event
    Chrome浏览器读写系统剪切板
  • 原文地址:https://www.cnblogs.com/dszhazha/p/Exponentiation.html
Copyright © 2020-2023  润新知