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 }

 

总结:前面两道题比较简单,难度为一颗星。最后这道有点难度,主要用到了指针,动态分配内存知识,可能指针的操作自己忘记了,感觉还是有问题。然后今天自己捕捉到很多有关字符串,指针的错误,值得好好学习下。
欢迎交流!
 
 
 
posted @ 2017-10-09 21:13  百草春生  阅读(202)  评论(0编辑  收藏  举报