函数(二)

简介: 函数(二)

一.函数代码练习

1.写一个函数判断一个数是不是素数,是素数返回1.不是返回0.打印100-200之间的素数

题目中既然把素数作为判断部分,那么我们可以采用函数作为判断条件,基本架构如下:

int main()
{
  int i = 0;
  for (i = 101; i <= 200; i=i+2)
  {
    if (is_prime(i))
    {
      printf("%d\n", i);
    }
  }
  return 0;
}

偶数不可能是素数,所以直接pass掉。

下面是函数部分:

int prime(int x)
{
  int j = 0;
  for (j = 2; j <= sqrt(x); j++)
  {
    if (x % j == 0)
    {
      return 0;
    }
    return 1;
  }
}

关于sqrt平方的方法,后续会作出说明。

基本上素数方面只需要掌握2个循环就行了,而要想引入函数,把函数当作判断也是一种不错的组合。

检查了一遍我居然犯了一个致命错误,return 1不应该在for循环里,这样会导致每一个数都会变成素数,根本判定不了。

2.写一个函数判断一年是不是闰年 1000-2000

int decide(int n)
{
  if (n % 400 == 0 || (n % 4 == 0 && n % 100 != 0))
  {
    return 1;
  }
  else
  {
    return 0;
  }
}
int main()
{
  int i = 0;
  int count = 0;
  for (i = 1000; i <= 2000; i++)
  {
    if (decide(i))
    {
      count++;
      printf("%d\n", i);
    }
  }
  printf("%d", count);
  return 0;
}

会发现这是老套路了,就是通过把函数返回的数组作判断条件。

3.写一个函数,实现整形有序数组的二分查找,找到了就返回下标,找不到就返回-1。

int half(int arr[], int k, int sz)
{
  int left = 0;
  int right = sz - 1;
  int count = 0;
  while (left <= right)
  {
    int mid = (left + right) / 2;
    if (arr[mid] > k)
    {
      right = mid - 1;
    }
    else if(arr[mid]<k)
    {
      left = mid + 1;
    }
    else
    {
      count = 1;
      return mid;
    }
  }
  if (count != 1)
  {
    return -1;
  }
}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int k = 0;
  scanf("%d", &k);
  int sz = sizeof(arr) / sizeof(arr[0]);
  int ret = half(arr, k, sz);
  if (ret != -1)
  {
    printf("找到了,下标是%d", ret);
  }
  else
  {
    printf("找不到");
  }
  return 0;
}

这里的返回操作基本和无函数没有区别,唯一要注意的是上传过去的数值要有所甄别,不用一股脑全传,挑一些重要的数值即可。

4.写一个函数,每调用一次这个函数,num的值就加1.

int main()
{
  int num = 0;
  prime()
  return 0;
}

首先传输的是地址,因为如条件所言的话不仅仅是形参需要变化,实参也要跟着改变。

void prime(int *num)
{
  *num = *num + 1;
}
int main()
{
  int num = 0;
  prime(&num);
  printf("%d\n", num);
  prime(&num);
  printf("%d\n", num);
  return 0;
}

剩下就简单了,在函数内部实现Num++就行了,不过因为接受的是地址,所以是*num++.

二.链式访问

int main()
{
  printf("%d", printf("%d", printf("43")));
  return 0;
}

如图所示,按照这样的结构最终会打印出什么呢?

首先,printf的返回值是整型int,其次打印了几个字符就返回数字几。例如打印43则返回2,而2作为打印为1个字符就返回1.

int main()
{
  printf("%d", printf("%d", 2));
  return 0;
}

所以最后结果为4321。

需要注意的是如果是打印了%d\n的话,那么在屏幕上会识别到换行,这样\n也会作为字符计算的。

相关文章
|
3天前
|
云安全 人工智能 自然语言处理
|
7天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
716 17
|
10天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
750 57
Meta SAM3开源:让图像分割,听懂你的话
|
8天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
329 116
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
AgentEvolver:让智能体系统学会「自我进化」
AgentEvolver 是一个自进化智能体系统,通过自我任务生成、经验导航与反思归因三大机制,推动AI从“被动执行”迈向“主动学习”。它显著提升强化学习效率,在更少参数下实现更强性能,助力智能体持续自我迭代。开源地址:https://github.com/modelscope/AgentEvolver
495 37
|
23天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
2天前
|
Rust 安全
掌握Rust文件读取(从零开始的IO操作指南)
本教程手把手教你用Rust读取文件,涵盖`read_to_string`一次性读取和`BufReader`逐行高效读取,适合初学者掌握安全、高效的Rust文件操作,助你轻松入门系统编程。
149 113