经典编程题目

语言部分

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;
}

回文串以及镜像串

回文串就是正读反读一个样,镜像串就是取完他的镜像以后才是个回文串。

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值