语言部分
scanf("%d%d",&a,&b);//读取键盘输入并放到int类型a和b中
scanf("%s",s);//遇到空格或者TAB键表示该语句执行完毕,s为一个char数组
int c=getchar();//读入单个字符,使用putchar(c)输出
scanf("%lf%lf", &r, &h);//lf对应的是double类型
sscanf(&s[i],"%d",&v);//以数组s为输入源,输入源为一个指针,看成一个从i位置开始的字符串,赋值给v,适用于在字符串数组中取数字
printf("%d\n",8/5);//表示整数部分(整数除法)
printf("%04d\n",a);//按照4位数打印,不足补零,超出按原样输出
printf("%4d\n",a);//按照4位数打印,不足补空格,超出按原样输出
printf("%.1f\n",8.0/5.0);//表示保留一位小数部分(实数除法)
printf("%f\n",8.0/5.0);//表示实数
sprintf(buf,"%d",x)//输出到数组buf中
scanf("\n")//读取换行符,此时输入流中就没有换行了
fgets(&s[i],maxn,stdin)//从标准输入流中获取最多maxn-1个数据到数组s中,空白符换行符也包括在内,读到换行符就不再继续读了。
优先级:
解引用的优先级比正负号高;
#include<cmath>
sqrt(3)//数学函数计算算术平方根
acos(-1.0)//cos pi = -1,求出pi值
double ceil(double x);//向上取整
double ceil(double x);//向下取整
#include<algorithm>
sort(a,a+10);//左闭右开区间的元素排序
max_element(a,a+10);//左闭右开区间的最大元素的地址
upper_bound(a,a+10,x);//左闭右开区间的最后的已排序好的元素的下一个地址,
lower_bound(a,a+10,x);//左闭右开区间的第一个已排序好的元素地址,大于等于他的第一个地址
atan2(y,x);//一到四象限的极角,[-pi,pi]
#include<cctype>
isalpha(ch)//判断是否是大写字母,大写返回2小写返回1非字母返回0
isspace(ch)//判断是否是空白或空格或制表符,是的话返回非零值
islower(ch)//判断小写
isupper(ch)//判断大写
#include<cstring>
strchr(s,buf[i])//在字符串s中查找buf[i]是否存在,返回该字符的地址
strcmp(s,"()")//若字符串与s相等就返回0
strlen(buf);//数组buf的元素个数
memset(a,0,sizeof(a));//a为一个数组
memcpy(a,b,sizeof(a));//a b 都是数组
#include<string>
string line;
getline(cin, line)//循环用字符串读取一行数字,注意空格也读进去了,遇到换行就返回真
#include<sstream>
string line,cmd;
stringstream ss(line);//读取line到ss流,ss就相当于cin,与getline配合使用
ss>>cmd;//输入到cmd中,遇到空白符停止输入,输入完毕以后ss中就没有相应的字符了
#include<map>
string s;
map<string,int> x;
x.count(s);//统计容器与关键字s相等的个数
#include<vector>
vector<int> x;
x.size();//统计容器中个数
#include<set>
x.clear();//使用之前的情况操作
x.count(s);//统计容器与关键字即值s相等的个数
x.insert(s);//插入操作
x.erase(s);//删除操作
x.erase(it++)//删除操作
it=x.find(s);//返回c的地址
vector<Cell> P;//当为类类型时,必须在结构体里定义小于号,因为set容器是按照大小排列的。
struct Cell {
int x, y;
Cell(int x=0, int y=0):x(x),y(y) {
};
bool operator < (const Cell& rhs) const {
return x < rhs.x || (x == rhs.x && y < rhs.y);
}
};
#include<queue>
priorit_queue<int,vector<int>,greater<int>> q;//优先队列,有序排序队列,最小元素排在队列前面
q.top();//访问第一个元素,但不删除
q.pop();//移除第一个元素
q.push(ans);//插入元素,根据ans大小插入,不一定插入在队尾
c题目部分
框架
重定向版
datain为自己建立的txt文件,dataout为程序建立的,datain文件重命名不需要后缀.txt
本例程为寻找输入一组整数的最小值、最大值、平均值。
#include<stdio.h>
#define INF 10000
int main()
{
freopen("datain.txt","r",stdin);
freopen("dataout.txt","w",stdout);
int x,n=0,min=INF,max=-INF,s=0;
while(scanf("%d",&x)==1)
{
s+=x;
if(x<min) min=x;
if(x>max) max=x;
n++;
}
printf("%d %d %.3f\n",min,max,(double)s/n);
return 0;
}
fopen版
#include<stdio.h>
#define INF 10000
int main()
{
FILE *fin, *fout;
fin=fopen("input.txt","rb");
fout=fopen("output.txt","wb");
int x,n=0,min=INF,max=-INF,s=0;
while(fscanf(fin,"%d",&x)==1)
{
s+=x;
if(x<min) min=x;
if(x>max) max=x;
n++;
}
fprintf(fout,"%d %d %.3f\n",min,max,(double)s/n);
fclose(fin);
fclose(fout);
return 0;
}
标准输入输出版
输入结束后,先按enter键,再ctrl+z,最后按enter键。
#include<stdio.h>
#define INF 10000
int main()
{
int x,n=0,min=INF,max=-INF,s=0;
while(scanf("%d",&x)==1)
{
s+=x;
if(x<min) min=x;
if(x>max) max=x;
n++;
}
printf("%d %d %.3f\n",min,max,(double)s/n);
return 0;
}
多组数据版
n=0为结束标记
输入:
8
2 8 3 5 1 7 3 6
4
4 6 10 0
0
#include<stdio.h>
#define INF 10000
int main()
{
int x,n=0,kase=0;
while (scanf("%d",&n)==1&&n)
{
int min=INF,max=-INF,s=0;
for(int i=0;i<n;i++)
{
scanf("%d",&x);
if(x<min)min=x;
if(x>max)max=x;
s+=x;
}
if(kase)printf("\n");
printf("Case %d: %d %d %.3f",++kase,min,max,(double)s/n);
}
return 0;
}
鸡兔同笼
设鸡有x只,兔有y只,则x+y=n,2x+4y=m,求x y 即可
#include<iostream>
using namespace std;
int main()
{
int n,m,x,y;
scanf("%d%d",&n,&m);
y=(m-2*n)/2;
x=n-y;
if(m%2==1|| x<0 || y<0)
printf("No answer\n");
else
printf("%d %d\n",x,y);
return 0;
}
开灯问题
n盏灯,第一个人把所有的灯打开,第二个人把编号为2的倍数的灯开关按下,第三个人把编号为3的倍数的开关按下,一共k个人,问最后哪些灯开着,k<=n<=1000。
开关问题就是取反操作的问题,倍数问题就是取余操作的问题。
要求输出第一个没有空格中间空格间隔最后元素没有空格。
#include<stdio.h>
#include<string.h>
#define INF 1010
int op[INF];
int main()
{
int n,k,flag=1;
memset(op,0,sizeof(op));//数组置零
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++)
for (int j=1;j<=n;j++)
if(j%i==0)
op[j]=!op[j];
for(int i=1;i<=n;i++)
if(op[i])
{
if(flag)//标志量,设置第一个元素前和最后一个元素尾没有空格,之间有全部有空格
flag=0;
else printf(" ");
printf("%d",i);
}
printf("\n");
return 0;
}
蛇形填数
在一个n x n 的矩阵里,形如
7 8 1
6 9 2
5 4 3
从右上角开始赋值,不断向下走然后向左,然后向上,然后向右,继续第二层循环,填数原则为:先判断再移动。判断是否越界并且是否已经填过数。
#include<stdio.h>
#include<string.h>
#define INF 10
int op[INF][INF];
int main()
{
int n,x,y,tot=0;
scanf("%d",&n);
memset(op,0,sizeof(op));
tot=op[x=0][y=n-1]=1;
while(tot<n*n)
{
while(x+1<n && !op[x+1][y]) op[++x][y]=++tot;//保证不越界并且下一个元素未被填入时循环
while(y-1>=0 && !op[x][y-1]) op[x][--y]=++tot;
while(x-1>=0 && !op[x-1][y]) op[--x][y]=++tot;
while(y+1<n && !op[x][y+1]) op[x][++y]=++tot;
}
for(x=0;x<n;x++)
{
for(y=0;y<n;y++)
printf("%3d",op[x][y]);
printf("\n");
}
return 0;
}
乘法竖式问题
三位数乘两位数的算式,列出竖式,要求输入数字集合不含空格,在竖式中找出满足该集合的所有竖式,采用字符串数组保存输入数字,遍历所有的三位数与两位数相乘,求出满足条件的竖式打印出来。(句号代表空格)
输入:2357
输出:
<1>
。。 775
X 。。33
。。。。。
。2325
2325。
。。。。。
25575
解决方案:1
#include<stdio.h>
#include<string.h>
int main()
{
int count=0;
char s[20],buf[99];
scanf("%s",s);//读入字符串到字符数组
for(int abc=100;abc<=999;abc++)
for(int de=10;de<=99;de++)
{
int x=abc*(de%10),y=abc*(de/10),z=abc*de;
sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z);
int ok=1;
for(int i=0;i<strlen(buf);i++)//strlen为字符串数组实际长度,不包括结束符
if(strchr(s,buf[i])==NULL) ok=0;//字符比较
if(ok)
{
printf("<%d>\n",++count);
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",abc,de,x,y,z);
}
}
printf("解决方案:%d\n",count);
return 0;
}
英语中的引号问题
把一段英语中的引号,改为正确的左引号与右引号;
因为引号是成对出现的,所以只需要将第一个引号改为左引号,第二个引号不变,第三个引号改为左引号,以此类推即可。
因为引号只是一个字符,可以对他进行边读边处理,不需要把完整输入的字符串完整地存下来。使用getchar()函数即可。该函数返回一个int值,遇到EOF才会停止。
#include<stdio.h>
int main()
{
int c,f=1;
while((c=getchar())!=EOF)
{
if(c=='"')
{
printf("%s",f?"``":"''");
f=!f;
}
else printf("%c",c);
}
return 0;
}
键盘错位问题
输入的字符总是比在键盘实际中的位置的向右一个,要进行归位,使用getchar()边读边处理,在while中他遇到换行会执行语句但是不会停止读入,我们可以定义一个常量数组保存键盘位置的值,遍历找到错误的这些值进行修正。
#include<stdio.h>
#include<stdio.h>
int main()
{
int i, c;
char k[]={
"`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./"};
while((c=getchar())!=EOF)
{
for(i=1;k[i]&&k[i]!=c;i++) ;//遍历数组直到找到输入数据
//若没有找到数据到结束符停止
//循环体什么指令也不执行,只是寻找i的数值
//这里的i必须定义在for循环外部
if(k[i])putchar(k[i-1]);
else putchar(c);
}
return 0;
}
回文串以及镜像串
回文串就是正读反读一个样,镜像串就是取完他的镜像以后才是个回文串。