习题
- 打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。 例如: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;
}
- 一球从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;
}
- 用迭代法求平方根,公式: 求 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
#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;
}
- 自守数自守数是指一个数的平方的尾数等于该数自身的自然数。
例如:
$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;
}
作业
-
若一个正整数从左向右读与从右向左读都一样,我们就将其称之为回文数(例如12321、44、3都是回文数)。输入一个正整数,判断它是否是回文数,是则输出YES,否则输出NO。
-
输入一个字符串,统计其中英文字母、数字字符和其他字符的个数。