1.取小数后几位只需要
- #include<bits/stdc++.h>
- using namespace std;
- int main()
- {
- double n;
- cin>>n;
- cout<<fixed<<setprecision("几位小数")<<n;
- }
----------------------------------------------------------------------------------------------------------------------
提取位数
取余几位就是求的后面几位,而除几位是取前面几位
- //取一个三位数的各个位
- int h;
- cin>>h;//表示一个三位数
- int a=h/100;//求百位
- int b=h/10%10;//十位
- int c=h%10;//个位
3.时间换算
可能存在进位,所以如果分减掉分不够减是就要使小时--,使分钟+=60,还要看存不存在跨天的情况。
---------------------------------------------------------------------------------------------------------------------
4.复赛2015年第二题
题目描述:
扫雷游戏是一款十分经典的单机小游戏。
在 n 行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。
玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。
游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
现在给出 n 行 m 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。
输入格式
输入文件第一行是用一个空格隔开的两个整数 n和 m,分别表示雷区的行数和列数。
接下来 n 行,每行 m 个字符,描述了雷区中的地雷分布情况。
字符 *
表示相应格子是地雷格,字符 ?
表示相应格子是非地雷格。相邻字符之间无分隔符。
输出格式
输出文件包含 n 行,每行 m个字符,描述整个雷区。
用 *
表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符
--------------------------------------------------------------------------------------------------------
思路:这里涉及到了偏移量,所以先要用偏移数组要将偏移量保存在里面
之后定义一个二维的数组将输入的雷全部保存再里面。之后再定义一个int类型,保存里面的雷的数量首先要输入
不会输入就找个厂子上吧
- for(int i=0;i<n;i++)
- {
- for(int j=0;j<m;j++)
- {
- cin>>q[i][j];
- }
- }
之后再枚举那里边的雷,先要判断他们是不是雷,如果是的话就不用执行了,所以我们要判断如果他不是雷我们才要继续进行下去之后我们要枚举偏移量之后得到一个偏移量
之后我们要进行越界检查,要判断他是否越界,如果越界直接continue,就不用白费功夫了,
之后判断如果有地方是雷的话直接让我们之前定义的a数组让a[i][]j++;
-最后就是循环输出了,注意一定是等一次循环完之后再输出一个换行
-------------------------------------------------------------------------------------------------------------------------
代码实现:
- #include<bits/stdc++.h>
- using namespace std;
- int a[110][110];
- char q[110][110];
- int dx[]={-1,-1,-1,0,1,1,1,0};
- int dy[]={-1,0,1,1,1,0,-1,-1};
- int main()
- {
- int n,m;
- cin>>n>>m;
- for(int i=0;i<n;i++)
- {
- for(int j=0;j<m;j++)
- {
- cin>>q[i][j];
- }
- }
- for(int i=0;i<n;i++)
- for(int j=0;j<m;j++)
- {
- if(q[i][j]!='*')
- {
- for(int k=0;k<8;k++)
- {
- int x=i+dx[k],y=j+dy[k];
- if(x<0||x>=n||y<0||y>=m) continue;
-
- if(q[x][y]=='*')
- {
- a[i][j]++;
- }
- }
- }
- }
- for (int i = 0; i < n; i ++ )
- {
- for (int j = 0; j < m; j ++ )
- {
- if(q[i][j]=='*')
- {
- cout<<q[i][j];
- }else
- cout<<a[i][j];
- }
- cout<<endl;
- }
- }
----------------------------------------------------------------------------------------------------------------------------
2015年第一道题--金币
题目介绍:
国王将金币作为工资,发放给忠诚的骑士。
第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……。
这种工资发放模式会一直这样延续下去:当连续 N 天每天收到 NN枚金币后,骑士会在之后的连续 N+1 天里,每天收到 N+1 枚金币。
请计算在前 K 天里,骑士一共获得了多少金币。
输入格式
输入文件只有 1 行,包含一个正整数 K,表示发放金币的天数。
输出格式
输出文件只有 1行,包含一个正整数,即骑士收到的金币数。
-----------------------------------------------------------------------------
首先我们要定义四变量一个sum累加,最后输出,一个day表示天数初始化为1,一个daymoney表示每天收到的钱,初始化为1,还有一个K,表示前K天的钱;
要用for循环,之后让day--,因为day是要一直变化的,之后如果day等于零了,让daymoney++,因为钱随着天数越来越多,之后让天数再等于钱day--之后还要让sum+=daymoney,让sum不断累加
最后输出宿命、即可
---------------------------------------------------------------------------------------------------------------------、
代码实现
- #include <iostream>
- using namespace std;
- int main()
- {
- int day=1,dm=1,k;
- cin>>k;
- int sum=0;
- for(int i=1;i<=k;i++)
- {
- day--;
- sum=sum+dm;
- if(day==0)
- {
- dm++;
- day=dm;
- }
- }
- cout<<sum;
- }