今天做一道输出第一次出现的数题目时,使用了用一个数组存储之前出现过的数,然后搜索数组判断是否出现过。这是用时间换空间的方法。

当然也可以用空间换时间,如果数据范围已知且不大,比如为1到100
可以直接定义一个大小为100的数组 初始化为0
输入一个数时,若a[i-1]为0则输出,并对a[i-1]做标记

然后想到了用二进制数作为标记的方法,进一步节省空间。但是只能用于数据范围很小的数 比如0-30
若0出现了则第0位为1
30出现了则第30位置为1,即该数加上2的30次方
输入时,比如要判断30是否出现过,将该数除以2的30次方然后mod10不为0则第30位为1

#include<stdio.h>
int main()
{int a[20]={0};int i,n;for(i=0;i<20;i++){scanf("%d",&a[i]);if(search(a,a[i],i)==0){printf("%d ",a[i]);}  }  return 0;
}
int search(int a[],int t,int size)
{int i;for(i=0;i<size;i++){if(a[i]==t)return 1;}return 0;
}
#include<stdio.h>
int i,a,b,n;
long long num[8]={0};
for(a=1;a<20;a++)
{for(b=1;b<20;b++){n=a*a+b*b;if(n<=400){num[n/64]=(((num[n/64]>>(n%64))|1)<<(n%64))|num[n/64];}}
}for(i=0;i<=400;i++)
{if((num[i/64]<<63)>>63&1==1)printf("%d ",i);num[i/64]=num[i/64]>>1;
}

关键代码:
num[n/64]=(((num[n/64]>>(n%64))|1)<<(n%64))|num[n/64];
n为要标记的数,n/64确定标记数组中的下标,也就是数组中第一个long long 负责标记0-63 第二个标记64-127 以此类推
n%64为应该标记数组中第n/64个数的第几位
通过先右移,最低位置1,然后左移实现修改
由于右移过程中低位丢失,所以需要再与原来的数按位取或,恢复前面的值

读取标记位
if((num[i/64]<<63)>>63&1==1)
通过左移后右移再与1按位与判断最低位是否为1

并且每轮num[i/64]=num[i/64]>>1; 右移一位

二进制数代替数组做标记相关推荐

  1. C语言-二维数组做函数的参数

    文章目录 1 引例 2 观点1 这种使用方法是错误的 3 观点2 根本不需要这么做 4 二维数组做函数参数的方法 4.1 方法1 4.2 方法2 4.3 方法3 5 与Java的不同 1 引例 下面的 ...

  2. 【C 语言】数组 ( 多维数组做函数形参退化为指针过程 | int array[2][3] -> int array[][3] -> int (*array)[3] )

    文章目录 一.多维数组做函数形参退化为指针过程 1.使用 int array[2][3] 作函数参数 2.使用 int array[][3] 作函数参数 3.使用 int (*array)[3] 作函 ...

  3. C语言多维数组做函数参数技术推演

    多维数组做函数参数技术 C语言中只会以机械式的值拷贝的方式传递参数(实参把值传给形参) 二维数组参数同样存在退化的问题 等价关系 C语言中只会以机械式的值拷贝的方式传递参数(实参把值传给形参) int ...

  4. C语言多维数组做函数参数退化原因大剖析

    多维数组做函数参数退化原因 多维数组做函数参数退化原因大剖析 多维数组做函数参数退化原因大剖析 //证明一下多维数组的线性存储 //线性打印 void printfArray411(int *arra ...

  5. C语言中数组做函数参数的问题

    数组做函数参数,会退化成为一个指针变量.因此在进行数组参数传递的同时,需要传递一个数组长度的参数变量. 数组长度可以通过sizeof(arr)/siezof(arr[0])来得到.关于这个sizeof ...

  6. java 11:数组作为函数参数,数组做为函数返回值

    1 数组作为参数 我们可以将数组作为参数,传入到函数中,其实就像我们main函数中 public void main(String [] args){};就是用数组作为函数参数: 又如, [java] ...

  7. myBatis的xml映射文件中传入list集合与数组做条件

    mybatis的xml映射文件中传入list集合与数组做条件 1.传list集合参数 1.1sql映射: <select id="queryDeptListByBankLevelAnd ...

  8. 《学习之道》第四章学习方法16学会做标记,而不是只划线

    做标记前,要先训练自己找到主要观点,并把所做标记数量降到最少.在留白区域记下总结好的关键概念. 转载于:https://www.cnblogs.com/158-186/p/10297148.html

  9. 如何用手机在图片上标箭头_如何在手机上快速给图片做标记?

    https://www.zhihu.com/video/984828945480482816 什么时候,你会需要在手机上给图片做标记呢? 社交工具办公时,需要向网络那边的另一个家伙指出需要修改.优化的 ...

最新文章

  1. 手把手教你怎样免费注冊国际顶级域名
  2. AI人工智能-智能学习时代
  3. Python相对导入导致SystemError的解决方案(译)
  4. Opencv-Python部署SIFT函数问题的处理
  5. STL源码剖析 内存基本处理工具 初始化空间的五个函数
  6. 输入回车时结束循环python_python-用户输入退出以在循环时中断
  7. Nginx之配置后端服务器组
  8. go mysql 多并发_MySQL并发处理-Go语言中文社区
  9. SQL——后台分页(C#,mysql)
  10. jmeter非GUI的运行命令
  11. 语言 蜗牛爬树问题_育儿小知识:睡前聊天,也会提升孩子的语言能力!
  12. PADS Layout 滴泪、敷铜和删除
  13. 物价上涨 下馆子点菜的省钱办法
  14. 计算机网络拓扑星型优点和缺点,星型结构拓扑有哪些优缺点 星型结构拓扑优缺点介绍【图文】...
  15. awgn信道c语言程序,关于awgn信道的程序求解~!
  16. 理解泰勒中值定理1的证明过程的两个影响理解的简单隐含推导
  17. 数据分析[1.1]--拆解方法总结
  18. 果汁机器人传销_【调查】“洋果汁治百病”?然健环球涉嫌传销大起底
  19. 拓扑排序之AOV,关键路径之AOE
  20. Java的getter_java动态调用getter方法

热门文章

  1. 老平台已死,整理个文档留下做纪念
  2. mini mp3模块 输出_小米有品众筹魔方mini电脑主机
  3. java 抽象类 模板_Java抽象类的构造模板模式用法示例
  4. 【Paper】2018_多无人机协同编队控制算法研究_林倩玉
  5. 9.2 协同过滤-机器学习笔记-斯坦福吴恩达教授
  6. android 修改ramdisk.img和init.rc android启动后设置/data权限为770
  7. windows 11预览版来了!
  8. 九、linux设备节点注册
  9. JAVA入门笔记·我的第一个JAVA程序
  10. 人工智能最佳学习实践