# 计算机组成部分 > 输入设备:输入语句 > 输出设备:输出语句 > 存储器:数据类型 > 运算器:运算符 > 控制器:运行逻辑 中央处理器(cpu):运算器+控制器 # 输入输出 c语言输入输入: ```c++ int a; scanf("%d",&a); printf("%d",a); /* 占位类型 int d long long ld double lf char c float f */ /* %[标记][长度][.[精度位数]][类型] 标记: 空格:默认右对齐 +:正数显示加号 -:左对齐 0:空位补0 printf("%05d",1);//00001 长度: 当前数据至少占的宽度 精度: .数字 代表保留多少位小数,限于double和float用 */ ``` c++输入输出: ```c++ //空格和回车有特殊功能 cin>> cout<< ``` 字符专用输入输出: ```c++ char c; c=getchar(); int a=98; putchar(a);//将括号的内容,以字符的形式输出 ``` # 数据类型 ```c++ long long 8 int 4 short 2 float 4 double 8 char 1 bool 1 string cout<<sizeof(变量); ``` # 运算符 ## 逻辑运算符 ```c++ && || ! ``` ## 算术运算符 ```c++ + - * / % += -= *= /= %= ++ -- ``` ## 关系运算符 ```c++ > < >= <= == != ``` ### 错写相等 ```c++ if(a=值){ 此时的条件的值真假为赋值给a的具体值 } ``` ### 连续使用 ```c++ if(3<a<5){ 3<a 的值为1或0,均小于5,恒成立 } ``` # 运行逻辑(控制流程) ## 顺序结构 ```c++ 从上到下执行 ``` ## 分支(选择) ```c++ if(条件) 代码 else if(条件) 代码 else 代码 ``` ```c++ switch(可确定的值){ case 值1:代码;break; case 值2:代码;break; case 值3:代码;break; default:代码; } //没有break会一直往下运行 ``` ## 循环 ```c++ for(代码;条件;代码) 代码 ``` ```c++ while(条件) 代码 ``` ```c++ do{ 代码 }while(条件); ``` # ASCII ```c++ '0'-'9' 48-57 'A'-'Z' 65-90 'a'-'z' 97-122 ' ' 32 '\0' 0 ``` # 交换算法 ## 中间变量 ```c++ int a=5,b=10; int c=a; a=b; b=c; ``` ## 交换函数 ```c++ int a=5,b=10; swap(a,b); ``` # 常用函数 ```c++ swap(a,b);//交换函数 sqrt(num);//开平方根,返回值是double 如果应用,需要用整数,需要四舍五入 int(sqrt(num)+0.5);//手动四舍五入 round(sqrt(num));//默认四舍五入函数 pow(a,b);//求幂函数,返回值是double max(a,b);//最大值 min(a,b);//最小值 ``` # 类型题 ## 累加问题 > 初始值为0 > 循环范围,范围明确for,范围未知while > 累加项 ## 累乘问题 > 初始值为1 > 循环范围,范围明确for,范围未知while > 累乘项(注意范围,可能需要过程中取余) ## 数字拆分问题 ```c++ %10 求后面的数字 /10 去掉后面的数字 int a=3456789; while(a){ if(a%10%2==0) cout<<a%10; a/=10; } 输出:864 %1n个零:代表保留后面n个数字 /1n个零:代表去掉后面n个数字 int a=123456789; 6789:%10000 123:/1000000 ``` ## 数字拼接问题 ```c++ int num=234567; //回文数 int n=num; int num2=0; while(n){ num2=num2*10+n%10; n/=10; } cout<<num2;//765432 if(num==num2) cout<<"yes"; //原则上,尽量不改变原来的数据,所以拆分的时候用替身 ## 判断质数 判断质数是:1~n之间没有数字能整除,才能是 判断质数否:1~n之间只要有一个能整除,就是否 设置默认是(难验证的方向) 判断过程中否定默认 int flag=1; int n; for(int i=2;i<=sqrt(n);i++){ if(n%i==0){ flag=0; break; } } if(flag) cout<<"yse"; else cout<<"no"; ``` ## 星阵问题 ```c++ 输入:2 输出: * ** ** * * ** ** * 输入:3 * ** *** *** ** * * ** *** *** ** * ``` ## 最大公约数 最小公倍数 ### 穷举法 ```c++ int a,b; int ans=1; for(int i=1;i<=min(a,b);i++){ if(a%i==0&&b%i==0) ans=i; } cout<<ans; int a,b; int ans=1; for(int i=min(a,b);i>=1;i--){ if(a%i==0&&b%i==0){ ans=i; break; } } cout<<ans; ``` 已知p和q是a和b的最大公约数和最小公倍数 那么p*q=a*b 最小公倍数=a*b/最大公约数 ### 辗转相除法 ```c++ int a=346,b=220; 346/220=1..126 220/126=1..94 126/94=1..32 94/32=2..30 32/30=1..2 30/2=15...0 当余数为0时,除数就是答案 ``` |