C语言习题一

第一道题
题目:正数n的平方根可以通过一系列近似值来获得。每个近似值都比前一个更加接近准确值。第一个近似值是1,接下来的近似值则通过下面的公式来获得。

ai+1=ai+nai2

编写一个程序,读入一个值,计算并打印出它的平方根。如果你将所有的近似值都打印出来,你会发现这种方法获得准确结果的速度有多快、原则上,这种计算可以永远进行下去,它会不断产生更加准确的结果。但在实际中,由于浮点变量的精度限制,程序无法一直计算下去,当某个近似值与前一个近似值相等时,你就可以让程序停止计算了。
思路:定义两个变量,分别记录前一个值和后一个值。后一个值通过公式计算,并计算两个值的绝对值,通过循环,找到最接近的值。
代码如下:

#include
#include
float CalaValue(int value)
{
    float frontValue = 1.0;  //前一个值

    float lastValue = (1 + value) / 2.0;  //后一个值
    while ((fabs(lastValue - frontValue))>0.0000001)
    {
        frontValue = lastValue;
        lastValue = (frontValue + value / frontValue) / 2.0;        
    }
    return lastValue;
}
int  main()
{
    int value = 0;
    printf("Input a number:");
    scanf("%d", &value);
    if (value>=0)
    {
        printf("%d的平方根为%f\n", value, CalaValue(value));
    }
    else
    {
        printf("输入值不合法\n");
    }
}

第二道题
题目:一个整数如果只能被它本身和1整除,它就被称为质数。请编写一个程序,打印出1-100之间的质数
思路:判断质数,使用平方根方法判断(数学原理)
代码如下:

#include
#include
int isPrime(int value)
{
    if (value == 1)
    {
        return 0;
    }
    else if (value == 2)
    {
        return 1;
    }
    for (int i = 2; i <= (int)sqrt(value); i++)
    {
        if (value%i == 0)
        {
            return 0;
        }
    }
    return 1;
}
int main()
{
    int i;
    for (i = 1; i < 100; i++)
    {
        if (isPrime(i))
        {
            printf("%d,",i);
        }
    }
    return 0;

}

第三道题
题目:请编写一个函数,它从字符串中提取一个子字符串。函数的原型如下:
int substr(char dst[], char src[], int start, int len);
函数的任务是从src数组起始位置向后偏移start个字符的位置开始,最多复制len个非NUL字符到dst数组。在复制完毕之后,dst数组必须以NUL字节
结尾。函数的返回值是存储于dst数组中的字符串长度。
如果start 所指定的位置越过了src数组的尾部,或者start或len的值为负,那么复制到dst数组的是个空字符串。
思路:动态为目标字符串申请空间并赋值
代码如下:

#include
#include
int substr(char dst[], char src[], int start, int len)
{
    int i = 0;
    if (start < 0 || len < 0 || start>strlen(src))
    {
        return 0;
    }
    else
    {
        while (src[start] != '\0' &&ireturn i;
}
int main()
{
    char *src = "hello";
    char *dst = (char *)malloc(sizeof(char) * 100);
    printf("存储于dst数组中的字符串长度为:%d\n", substr(dst, src, 0, 9));
    free(dst);
    return 0;

}

总结:前面两道题比较简单,难度为一颗星。最后这道有点难度,主要用到了指针,动态分配内存知识,可能指针的操作自己忘记了,感觉还是有问题。然后今天自己捕捉到很多有关字符串,指针的错误,值得好好学习下。
欢迎交流!

你可能感兴趣的:(C语言学习)