1.用setprecison()必有头文件iomanip和float,若输出结果为两数相除,其中一个为小数则结果为小数。
2.定义一个二位数组a[i][j],若其中各项全为字符,则可以用a[i]表示 i 一整行,但若各项是数字,想要对整行操作只能使用循环语句,例
给定一个5*5的矩阵(数学上,一个r×c的矩阵是一个由r行c列元素排列成的矩形阵列),将第n行和第m行交换,输出交换后的结果。输入共6行,前5行为矩阵的每一行元素,元素与元素之间以一个空格分开。
第6行包含两个整数m、n,以一个空格分开。(1 <= m,n <= 5)
输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。部分代码
int n,m,a[7][6],i,j;
for(i=1;i<=5;i++){
for(j=1;j<=5;j++){
cin>>a[i][j];
}
}
cin>>m>>n;
for(j=1;j<=5;j++) a[6][j]=a[m][j];
for(j=1;j<=5;j++) a[m][j]=a[n][j];
for(j=1;j<=5;j++) a[n][j]=a[6][j];
3.关于周期性T的问题,需要另设一个字母 t 用来记录周期,例
一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A和小B比了N轮之后,谁赢的轮数多?输入包含三行。
第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。0 < N,NA,NB < 100。
第二行包含NA个整数,表示小A出拳的规律。第三行包含NB个整数,表示小B出拳的规律。其中,0表示“石头”,2表示“剪刀”,5表示“布”。相邻两个整数之间用单个空格隔开。输出一行,如果小A赢的轮数多,输出A;如果小B赢的轮数多,输出B;如果两人打平,输出draw。部分代码
int n,a[9999],b[9999],s1=0,s2=0,s3=0,x,y,i,j=1;
cin>>n>>x>>y;
for(i=1;i<=x;i++) cin>>a[i];
for(i=1;i<=y;i++) cin>>b[i];
for(i=1;i<=n;i++){
a[i]=a[j];
j++;
if(j==x+1) j=1;
}
j=1;//如果有两个周期,要将周期记录数归一或另外设一个数
for(i=1;i<=n;i++){
b[i]=b[j];
j++;
if(j==y+1) j=1;
}
4.字符数组的输入
1)getchar
对于字符数组逐个输入使用a[i][j]=getchar();较为方便,但遇到空格或换行符(二者不作为数组的项),需要另加 getchar(); 吸收,否则空格和换行会记录为数组的项,同一个条语句 getchar(); 既可以吸收空格也可以吸收换行,例1
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷数。注:每个格子周围格有八个:上、下、左、右、左上、右上、左下、右下。输入第一行包含两个整数n和m,分别表示雷区的行数和列数。1 <= n <= 100, 1 <= m <= 100。
接下来n行,每行m个字符,‘*’表示相应格子中是地雷,‘?’表示相应格子中无地雷。字符之间无任何分隔符。输出n行,每行m个字符,描述整个雷区。若相应格中是地雷,则用‘*’表示,否则用相应的周围格地雷数表示。字符之间无任何分隔符。(输入部分)
int main(){
char b[101][101];
int s[101][101]={0},i,j,n,m;
cin>>n>>m;
getchar();
for(i=1;i<=n;i++){
for(j=1;j<=m;j++) b[i][j]=getchar();
getchar();
}
样例输入
3 3 *?? ??? ?*?
因为*与?空格之间没有空格,但两行之间有换行符号,所以 i 行一次要使用getchar();吸收换行
例2有一个N x N(N为奇数,且1 <= N <= 10)的矩阵,矩阵中的元素都是字符。这个矩阵可能会按照如下的几种变幻法则之一进行变幻(只会变幻一次)。 现在给出一个原始的矩阵,和一个变幻后的矩阵,请编写一个程序,来判定原始矩阵是按照哪一种法则变幻为目标矩阵的。 输入第一行:矩阵每行/列元素的个数 N;第二行到第N+1行:原始矩阵,共N行,每行N个字符;第N+2行到第2*N+1行:目标矩阵,共N行,每行N个字符;(输入部分)
int n,i,j,t=0,judge=0;
cin>>n;
char a[n][n],b[n][n],c[n][n];
getchar();
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
a[i][j]=getchar();
getchar();
}}
getchar();//此处为第一个矩阵和第二个矩阵,换行已经被上一句的getchar吸收,不需要另加
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
b[i][j]=getchar();
getchar();
}}
样例输入
5 a b c d e f g h i j k l m n o p q r s t u v w x y y x w v u t s r q p o n m l k j i h g f e d c b a
与例1不同的是每个字符与字符之间都有换行或空格,所以每输入字符都要执行 getchar();吸收
2)scanf
与getchar不同的是,scanf自动忽略空格和换行\n,因此scanf无法储存\n这个字符,例
例如,若信息是“There's no place like home on a snowy night”并且有5列,Mo会写成:
t o i o y h p k n n e l e a i r a h s g e c o n h s e m o t n l e w x
Mo根据这个矩阵重写信息:首先从左到右写下第一行,然后从右到左写下第二行,再从左到右写下第三行……以此左右交替地从上到下写下各行字母,形成新的字符串。这样,例子中的信息就被加密为:toioynnkpheleaigshareconhtomesnlewx。输入第一行包含一个整数(范围2到20),表示使用的列数。第二行是一个长度不超过200的字符串。(输入部分)
char a[201],b[201][201];
int i,j,k=0,n,t;
cin>>n;
getchar();
scanf("%s",a);//逐个输入依次记录为a[0]到最后一个,不是从1
t=strlen(a);
for(i=1;i<=(t/n);i++){
if(i%2)
for(j=1;j<=n;j++){
b[i][j]=a[k];
k++;
}
else for(j=n;j>0;j--){
b[i][j]=a[k];
k++;
}
}
样例输入
5 toioynnkpheleaigshareconhtomesnlewx
输入无空格,用getchar不方便因为不知道什么时候终止无法定循环次数,scanf前的getchar();可以加也可以不加,因为scanf忽略空格
5.求数组a 的长度可以用scanf和strlen,避免输入矩阵时只知道行列其一的尴尬,t 为行乘列
需要注意的是strlen需要头文件cstring,例子同上
6.快速排序的sort函数
需要头文件algorithm,第一个空为数组名+第一个项(看从0还是1开始) ,第二个空为数组名+最后一个项+1,例
在给定的n个互不相等的正整数中,寻找可以形成a*b=c的等式(a,b,c互不相等)的数目。比如在12,32,6,1,2,8,4中,只有2*4=8, 2*6=12, 4*8=32三对。注意:给出的正整数互不相同。正整数的最大值为2^32-1,正整数的最大个数为1000.输入第一行输入总共的正整数数目n(n<=1000)接下来的一行输入n个正整数,正整数之间用一个空格隔开。
int n,a[1001],s=0,i;
cin>>n;
for(int k=1;k<=n;k++) cin>>a[k];
sort(a+1,a+n+1);
使用排序的原因从小到大乘更为方便
7.只定义一个数组,它只有前面几个项为0,后面的项不一定为0,如果想将一个数组的全部元素设为0,需要用循环
for(i=1;i<10;i++)
for(j=1;j<10;j++)
a[i][j]=0;
8.个人需要记住的几种行列变化
以下a为原始矩阵,c是变化后
1)矩阵按照顺时针方向旋转90度
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
c[j][n+1-i]=a[i][j];
}
}
2)矩阵按照逆时针方向旋转90度
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
c[n+1-j][i]=a[i][j];
}
}
3)中央元素不变,其他元素与“以中央元素为中心的对应元素”互换;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
c[n+1-i][n+1-j]=a[i][j];
}
}
第三种与上面两个不同的是 i 和 j 不需要换
4)蛇形填充矩阵
for(k=1;k<=n;k++){
if(k%2) for(j=1;j<=k;j++){
i=k+1-j;
t++;
a[i][j]=t;
a[n+1-i][n+1-j]=n*n-t+1;
}
else
for(j=k;j>=1;j--){
i=k+1-j;
t++;
a[i][j]=t;
a[n+1-i][n+1-j]=n*n-t+1;
}
}
思路是以斜行为i,因为斜行才有行列递增递减规律
9.数字 1 不是素数
本文详细介绍了C++编程中的实用技巧,包括如何利用setprecision控制浮点数精度,二维数组的操作,如行交换和周期性问题解决,字符数组的高效输入方法,数组长度的确定,快速排序的应用,以及矩阵的复杂变换。这些技巧覆盖了数据结构、算法优化和输入输出控制,对提升C++编程效率有显著帮助。

被折叠的 条评论
为什么被折叠?



