基础练习题之函数

前言

这些题目来自与一些刷题网站,以及c primer plus,继续练习

第一题

给你一个数,让他进行巴啦啦能量,沙鲁沙鲁,小魔仙大变身,如果进行变身的数不满足条件的话,就继续让他变身。。。直到满足条件为止。

巴啦啦能量,沙鲁沙鲁,小魔仙大变身:对于一个数,把他所有位上的数字进行加和,得到新的数。

如果这个数字是个位数的话,那么他就满足条件。

给一个整数数字n(1<=n<=1e9) 输出由n经过操作满足条件的数

1分析

哎呀其实思路很简单, int 类型的大小大概可以到20亿左右

而这里的n的大小只有10亿 只需使用int类型的整型即可

那它要一个整数的各位之和,当然如果大家从来没有做过这类题目可能要斟酌一下

但是我们一眼就看出来了 使用while循环 判断条件即为该数

限制条件就是对他除10, 循环内部对它求模可以得到它的个位数大小

一次进行就可以得到它的各位之和,然而它还可以大于10之后加一个判断这个题目就出来了

2代码实现

#include <stdio.h>
int Ifbecome(int x)
{
    int flag=x;
    while(1)
    {
         int a=0;
         while(flag)
     {
       a+=flag%10;
       flag/=10;
     }
     if(a<10)
     return a;
     else
     flag=a;
    }
}

int main() {
    int a, b;
    while (scanf("%d", &a) != EOF) { 
printf("%d",Ifbecome(a));
    }
    return 0;
}

第二题

请统计某个给定范围[L, R]的所有整数中,数字2出现的次数

比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2次,所以数字2在该范围内一共出现了6次

输入共1行,为两个正整数L和R,之间用一个空格隔开。

输出共1行,表示数字2出现的次数。

1分析

这些题目还是很好的,用来打基础真的挺好

很明显和上个题目是有相似之处的 我们只要分别对范围内的数比较他们的各个位 数的大小与

2相判断即可 其实会上个题目 这个题目也会做

2,代码实现

#include <stdio.h>
int Count(int x)
{
    int a=0;
    while(x)
    {
        if(2==x%10)
        a++;
        x/=10;
    }
    return a;
}
int main() {
    int a, b;
    while (scanf("%d%d", &a,&b) != EOF) { 
    int i;
    int j=0;
    for(i=a;i<=b;i++)
    {
    j+=Count(i);
    }
    printf("%d",j);
    }
    return 0;
}

第三题

牛牛很喜欢发短信,他所用的通讯公司的收费方法如下:

1.每条短信收费0.1元

2.每条短息的字数不超过60字,如果超过60字,将按照0.2元的价格收费。

牛牛这个月发了 n 条短信,请问牛牛一共要缴多少短信费

第一行输入一个正整数 n ,表示发送短信的条数,

第二行输入 n 个正整数,表示牛牛发送的 n 条短信中每条短信的字数

输出牛牛这个月要缴的短信费

1分析

这个题目太简单了,简单的说一下

首先判断字数,一个if就行 然后注意得用浮点型来输出其他没什么

2代码实现

#include <stdio.h>
float Price(int x)
{
    if(x>60)
    {
        return 0.2;
    }
    else
    return 0.1;
}
int main() {
    int a, b;
    float c=0.0f;
    while (scanf("%d", &a) != EOF) {
      while(a)
      {
       scanf("%d",&b);
       c+=Price(b);
       a--;
      }
      printf("%.1f",c);
    }
    return 0;
}

第四题

牛牛刚刚学了素数的定义:素数值指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数

牛牛想知道在 [l,r] 范围内全部素数的和

输入两个正整数 l,r 表示闭区间范围 输出 [l,r] 范围内的素数的和

1分析怎么说素数的定义都告诉我们了 我们不就是让这个区间的数一直除以非1和非本身的数

只要不被整除,那么他就是素数

当然 我们可以有优化方案

就是说,在数学中只要一直除以它的算术平方根就行了

2代码实现

#include <stdio.h>
#include<math.h>
int Iszhishu(int x)
{
    if(x==1)
    return 0;
    int i;
    for(i=2;i<=sqrt(x);i++)
    {
        if(x%i==0)
        return 0; 
    }
    return x;
}
int main() {
    int a, b;
    while (scanf("%d %d", &a, &b) != EOF) { 
    int i;
    int count=0;
    for(i=a;i<=b;i++)
    {
    count+=Iszhishu(i);
    }
   printf("%d",count);
    }
    return 0;
}

第五题

前面几个题目来自于牛客网,大家可以去那里刷题,现在来看看比较基础的

接下来看 c primer plus的题目

设计一个函数min(x,y),返回两个double类型值的较小值

基础但是,多练

直接代码实现吧

#include<stdio.h>
double Min(double a,double b)
{
return a>b?b:a;

}
int main()
{
double a,b;
scanf("%lf %lf",&a,&b);
printf("%.2lf",Min(a,b));
return 0;
}

第六题

设计一个函数chline(ch,i,j)打印指定的字符i列j行

1分析这个题目很基础,没办法,题目是这样的,如果不会,建议你多多看书

2代码实现

#include<stdio.h>
void chline(char ch, int a, int b)
{
	int i, j;
	for (i = 0; i < a; i++)
	{
		for (j = 0; j < b; j++)
		{
			printf("%c", ch);
		}
		printf("\n");
	}
}
int main()
{
	while (1)
	{
		char ch;
		int ch0;
		int a, b;
		printf("输入要打印的字符\n");
		scanf("%c", &ch);
		printf("输入要打印的行列\n");
		scanf("%d%d", &a, &b);
		chline(ch, a, b);
		while ((ch0 = getchar()) && ch0 != '\n');
	}
	return 0;
}

3细节之处在于我们的万能清除缓存区最后一行的while中

通过这个函数可以把所有的"\n"清除防止被scanf接收到

虽然简单但是细节

我们发现这本书上的代码实践性更高

第七题

计算调和平均数先求两数的倒数,再求两个倒数的平均值,最后就算结果的倒数

直接代码实现

double Tiaohe(double x, double y)
{
	//return 1/((1/x+1/y)/2);这个结果没有化简
	return 2 / (1 / x + 1 / y);//化简后代码其实更高效
}
int main()
{
	double a, b;
	printf("请输入两个数\n");
	scanf("%lf %lf", &a, &b);
	double c=Tiaohe(a, b);
	printf("%.2lf", c);
	return 0;
}

值得注意的是,该调和平均数的算式可以化简,不要死算哦

第八题

编写一个函数,从标准输入中读取字符,直至遇到文件结尾程序得报告每个字符是否为字母

如果是还要报告字母在字母表的位置

再编写一个函数, 以一个字符为参数如果是字母返回一个数值位否则返回-1

没什么好说的代码

int Ifzimu(char ch);
void Readchar();
int main()
{
	Readchar();

	return 0;
}
void Readchar()
{
	char ch;
	while ((scanf("%c", &ch))==1)
	{
		int a=Ifzimu(ch);
		if (a!=-1)
			printf("%d ", a);
	}
}
int Ifzimu(char ch)
{
	if (ch >= 'A' && ch <= 'Z')
	{
		return (int)(ch - 'A' + 1);
	}
	else if (ch >= 'a' && ch <= 'z')
		return (int)(ch - 'a' + 1);
	else
		return -1;
}

总结

今天的题目到此为止祝大家开心

相关推荐
QAQ小菜鸟13 分钟前
一、初识C语言(1)
c语言
何曾参静谧28 分钟前
「C/C++」C/C++ 之 变量作用域详解
c语言·开发语言·c++
互联网打工人no132 分钟前
每日一题——第一百二十一题
c语言
朱一头zcy2 小时前
C语言复习第9章 字符串/字符/内存函数
c语言
此生只爱蛋2 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
何曾参静谧2 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
lulu_gh_yu3 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
~yY…s<#>5 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
EricWang13587 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
我是谁??7 小时前
C/C++使用AddressSanitizer检测内存错误
c语言·c++