习题

  1. 打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。 例如:153是一个水仙花数,因为$153=1^3+5^3+3^3$。
#include <stdio.h>
#include <math.h>
#include <string.h>

bool isNarcissistic(int num)
{
    char number[10] = {0};
    sprintf(number, "%d" , num);
    int sum = 0;
    for(int i = 0; i < strlen(number); ++i)
    {
        sum += pow(number[i]-48 , 3);
    }
    if(sum == num)
        return true;
    else
        return false;
}

int main(void)
{
    for(int i = 100; i <= 999; ++i)
    {
        if(isNarcissistic(i))
            printf("%d " , i);
    }
    printf("\n");
    return 0;
}
  1. 一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数
#include <stdio.h>

double solveHeight(double height, int time)
{
    double res = height;
    while(time--)
    {
        res = res / 2;
    }
    return res;  
}
 
double solveSumHeight(double height , int time)
{
    if(time == 1)
        return height;
    double res = height;
    for(int i = 2; i <= time; ++i)
    {
        res += (2 * solveHeight(height, i-1));
    }
    return res;
}

int main(void)
{
    double height = 10;
    printf("%.2lf\n" , solveHeight(10, 2));    
    printf("%.2lf\n" , solveSumHeight(10, 3));    
    return 0;
}
  1. 用迭代法求平方根,公式: 求 a 的平方根的迭代公式为: $X[n+1]=(X[n]+a/X[n])/2$ 要求前后两次求出的差的绝对值少于0.00001。 输出保留3位小数
#include <stdio.h>
#include <math.h>

double solveSquareRoot(double num , double guess)
{
    double x_n_0 = guess;
    double x_n_1 = 0;
    while(true)
    {
        x_n_1  = (x_n_0 + num / x_n_0) / 2;
        printf("%lf, %lf\n", x_n_0, x_n_1);
        if(fabs(x_n_1 - x_n_0) < 0.00001)
            return x_n_1;
        x_n_0 = x_n_1;
    }
}

int main(void)
{
    double num = 25;
    double guess = 1;
    printf("%.3lf\n" , solveSquareRoot(num, guess));      
    return 0;
}
  1. 数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找出其中的主要元素。若没有,返回 -1
#include <stdio.h>

int solveMain(int* array, int size)
{
    int main = array[0];
    int count = 1;
    for(int i = 1; i < size; ++i)
    {
        if(array[i] != main)
            --count;
        else
            ++count;
        if(count == 0)
        {
            main = array[i];
            ++count;
        }
    }
    count = 0;
    for(int i = 0; i < size; ++i)
    {
        if(array[i] == main)
            ++count;
    }
    return count > (size / 2) ? main : -1;     
}

int main(void)
{
    int arr[5] = {1, 2, 2, 3, 2};
    int res = solveMain(arr, 5);
    if(res == -1)
        printf("No main\n");
    else
        printf("Main: %d\n" , res);       
    return 0;
}
  1. 自守数自守数是指一个数的平方的尾数等于该数自身的自然数。
    例如:
    $25^2=625$
    $76^2=5776$
    $9376^2=87909376$
    请求出200000以内的自守数?
#include <stdio.h>
#include <string.h>

bool isAutomorphic(long num)
{
    char number[7] = {0};
    sprintf(number, "%ld", num);
    int digit = strlen(number);

    long num_square = num * num;
    int remainder = 10;
    while(--digit)
    {
        remainder *= 10;  
    }

    if(num % remainder != num_square % remainder)
        return false;
    return true;
}

int main(void)
{
    for(long i = 0; i < 200000; ++i)
    {
        if(isAutomorphic(i))
            printf("%ld " , i);
    }      
    printf("\n");
    return 0;
}

作业

  1. 若一个正整数从左向右读与从右向左读都一样,我们就将其称之为回文数(例如12321、44、3都是回文数)。输入一个正整数,判断它是否是回文数,是则输出YES,否则输出NO。

  2. 输入一个字符串,统计其中英文字母、数字字符和其他字符的个数。