C语言习题一
第一道题 题目:正数n的平方根可以通过一系列近似值来获得。每个近似值都比前一个更加接近准确值。第一个近似值是1,接下来的近似值则通过下面的公式来获得。
ai+1=(ai+(n/ai))/2
编写一个程序,读入一个值,计算并打印出它的平方根。如果你将所有的近似值都打印出来,你会发现这种方法获得准确结果的速度有多快、原则上,这种计算可以永远进行下去,它会不断产生更加准确的结果。但在实际中,由于浮点变量的精度限制,程序无法一直计算下去,当某个近似值与前一个近似值相等时,你就可以让程序停止计算了。 思路:定义两个变量,分别记录前一个值和后一个值。后一个值通过公式计算,并计算两个值的绝对值,通过循环,找到最接近的值。 代码如下:
1 #include<stdio.h> 2 #include<math.h> 3 float CalaValue(int value) 4 { 5 float frontValue = 1.0; //前一个值 6 7 float lastValue = (1 + value) / 2.0; //后一个值 8 while ((fabs(lastValue - frontValue))>0.0000001) 9 { 10 frontValue = lastValue; 11 lastValue = (frontValue + value / frontValue) / 2.0; 12 } 13 return lastValue; 14 } 15 int main() 16 { 17 int value = 0; 18 printf("Input a number:"); 19 scanf("%d", &value); 20 if (value>=0) 21 { 22 printf("%d的平方根为%f\n", value, CalaValue(value)); 23 } 24 else 25 { 26 printf("输入值不合法\n"); 27 } 28 }
第二道题
题目:一个整数如果只能被它本身和1整除,它就被称为质数。请编写一个程序,打印出1-100之间的质数
思路:判断质数,使用平方根方法判断(数学原理)
代码如下:
1 #include<stdio.h> 2 #include<math.h> 3 int isPrime(int value) 4 { 5 if (value == 1) 6 { 7 return 0; 8 } 9 else if (value == 2) 10 { 11 return 1; 12 } 13 for (int i = 2; i <= (int)sqrt(value); i++) 14 { 15 if (value%i == 0) 16 { 17 return 0; 18 } 19 } 20 return 1; 21 } 22 int main() 23 { 24 int i; 25 for (i = 1; i < 100; i++) 26 { 27 if (isPrime(i)) 28 { 29 printf("%d,",i); 30 } 31 } 32 return 0; 33 34 }
第三道题
题目:请编写一个函数,它从字符串中提取一个子字符串。函数的原型如下:
int substr(char dst[], char src[], int start, int len);
函数的任务是从src数组起始位置向后偏移start个字符的位置开始,最多复制len个非NUL字符到dst数组。在复制完毕之后,dst数组必须以NUL字节
结尾。函数的返回值是存储于dst数组中的字符串长度。
如果start 所指定的位置越过了src数组的尾部,或者start或len的值为负,那么复制到dst数组的是个空字符串。
思路:动态为目标字符串申请空间并赋值
代码如下:
1 #include<stdio.h> 2 #include<string.h> 3 int substr(char dst[], char src[], int start, int len) 4 { 5 int i = 0; 6 if (start < 0 || len < 0 || start>strlen(src)) 7 { 8 return 0; 9 } 10 else 11 { 12 while (src[start] != '\0' &&i<len) 13 { 14 dst[i] = src[start]; 15 start++; 16 i++; 17 } 18 } 19 return i; 20 } 21 int main() 22 { 23 char *src = "hello"; 24 char *dst = (char *)malloc(sizeof(char) * 100); 25 printf("存储于dst数组中的字符串长度为:%d\n", substr(dst, src, 0, 9)); 26 free(dst); 27 return 0; 28 29 }
总结:前面两道题比较简单,难度为一颗星。最后这道有点难度,主要用到了指针,动态分配内存知识,可能指针的操作自己忘记了,感觉还是有问题。然后今天自己捕捉到很多有关字符串,指针的错误,值得好好学习下。
欢迎交流!