距离上次写博客又已经将近一个月了,发现自己写得真的有点慢……
其实早在大一的时候就接触了,但是仅仅只是局限在使用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
Output
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,我就纠结了。。。想想也觉得任重而道远啊。。