题目:使用函数统计指定数字的个数。本题要求实现一个统计整数中指定数字的个数的简单函数。
输入:一个被统计数字number,类型为int;一个统计的数字digit(用于number中出现了几个digit,范围为[0,9]),类型为int。
输出:输出在number中出现了几次digit。
优化目标:无。
算法思想:如果number等于0且digit也是0,就count(统计出现次数) = 1。如果number是负数就转为正数。然后依次取出number的个位,判断是否和digit相等,相等就count++,再将number除10。重复操作,直到number不大于0。返回count。
#include
int CountDigit( int number, int digit );
int main()
{
int number, digit;
scanf("%d %d", &number, &digit);
printf("Number of digit %d in %d: %d\n", digit, number, CountDigit(number, digit));
return 0;
}
int CountDigit( int number, int digit ){
int count = 0;
if(number == 0&&digit == 0){
count = 1;
}
if(number<0){
number = -number;
}
while(number>0){
if(number%10 == digit){
count++;
}
number = number/10;
}
return count;
}
输入:1211253 1
输出:Number of digit 1 in 1211253:3
题目:使用函数输出水仙花数。水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。题目保证100≤m≤n≤10000。
输入:所要求的水仙花的上下界m和n,类型都是int。
输出:输出在m到n之间的水仙花数。
优化目标:无。
算法思想:函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。函数PrintN则打印开区间(m, n)内所有的水仙花数,每个数字占一行。先判断m是否为水仙花数,是就输出m(数字) is a narcissistic number,然后输出m到n之间的水仙花数,最后判断n是否为水仙花数,是就输出n(数字) is a narcissistic number。
#include
int narcissistic( int number );
void PrintN( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
PrintN(m, n);
if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);
return 0;
}
int narcissistic( int number ){
int a,sum = 0,n = 3,k = number;
if(number/1000 != 0){
n = 4;
}
while(k>0){
a = k%10;
if(n ==3){
sum = sum+a*a*a;
}
else{
sum = sum+a*a*a*a;
}
k = k/10;
}
if(sum == number){
return 1;
}
else{
return 0;
}
}
void PrintN( int m, int n ){
for(int i=m+1;i
输入:153 400
输出:
153 is a narcissistic number
370
371
题目:使用函数求余弦函数的近似值。本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e。cos(x)=x^0/0!-x^2/2!+x^4/4!-x^6/6!+...。
输入:误差上线e和自变量x,类型都为double。
输出:输出在误差小于e的情况下cos(x)的值。
优化目标:无。
算法思想:函数funcos应返回用给定公式计算出来、并且满足误差要求的cos(x)的近似值。输入输出均在双精度范围内。函数jiecheng为返回输入值的阶乘。调用funcos函数,对返回值进行输出。
#include
#include
double funcos( double e, double x );
double jiecheng(int n);
int main()
{
double e, x;
scanf("%lf %lf", &e, &x);
printf("cos(%.2f) = %.6f\n", x, funcos(e, x));
return 0;
}
double jiecheng(int n){
int i;
double s = 1;
for(i = 1;i<=n;i++){
s*=i;
}
return s;
}
double funcos( double e, double x ){
int i;
double s = 1,t = 1,xi = 1;
for(i = 2;xi>=e;i+=2){
t*=-1;
xi = pow(x,i)/jiecheng(i);
s+=xi*t;
}
return s;
}
输入:0.01 4
输出:cos(4.00) = -0.653839
题目:分类统计字符个数。本题要求实现一个函数,统计给定字符串中英文字母、空格、数字字符和其他字符的个数。输出格式:letter = 英文字母个数, blank = 空格个数, digit = 数字字符个数, other = 其他字符个数
输入:用户传入的字符串s,类型为char s[]。
输出:按格式输出英文字母个数、空格个数、数字字符个数、其他字符个数。
优化目标:无。
算法思想:设置letter,blank,digit,other分别存储英文字母、空格、数字字符、其他字符的个数,依次读取s数组中每一个元素并判断是否为对应元素,是就对应的计数加一,不是就other++。最后就按格式输出。
#include
#define MAXS 15
void StringCount( char s[] );
void ReadString( char s[] );
int main()
{
char s[MAXS];
ReadString(s);
StringCount(s);
return 0;
}
void ReadString( char s[] ){
gets(s);
return;
}
void StringCount( char s[] ){
int letter = 0,blank = 0,digit = 0,other = 0,i = 0;
while(s[i]!='\0'){
if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')){
letter++;
}
else if(s[i] == ' '){
blank++;
}
else if(s[i]>='0'&&s[i]<='9'){
digit++;
}
else{
other++;
}
i++;
}
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
}
输入:2112xsx 51x5s15 51x51 +-56+
输出:letter = 6, blank = 3, digit = 15, other = 3
今日总结:前段时间一直在做关于数据结构的题,感觉有点忽略了C语言本身的题,所以这几天就主要是练一下C语言的题。