蓝桥杯编程训练01
蛇形矩阵
这道题做了两遍,第一遍有个小地方没注意到,就是在每一行的输出中两个数字必须用一个空格隔开,所以自然的在每个格式%d后加了空格,然而出错了,应该是最后一个数据后不能加空格,应该直接加回车。
#include <stdio.h>
int main(){
int n,i=0,j=0; int a[100][100];
scanf("%d",&n);
a[0][0]=1;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
a[i][j+1]=a[i][j]+j+i+2;
}
j=0; a[i+1][0]=a[i][0]+i+j+1;
}
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
printf("%d ",a[i][j]);
}
printf("%d\n",a[i][j]); j=0;
}
return 0;
}
获得输入字符的方法汇总
三种获得字符串的方法的区别:scanf gets getchar
1)使用scanf("%s",&s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束
2)gets()函数将接收输入的整个字符串直到遇到换行为止
char src[100];
gets(src);
上述的两者在接受字符串时:
a.不同点: scanf不能接受空格、制表符Tab、回车等; 而gets能够接受空格、制表符Tab和回车等;
b.相同点: 字符串接受结束后自动加’\0’。
3)
getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab) getchar()使用不方便,解决方法:
使用下面的语句清除回车: while(getchar()!=’\n’);
具体的实例:
gets获取字符串代码
#include<stdio.h>
int main()
{
char src[100];
printf("input a string:");
gets(src);
printf("src = %s\n",src);
return 0;
}
//使用getchar()获取字符串
#include<stdio.h>
int main()
{
char ch;
char src[10];
int i = 0;
while((ch = getchar()) != '\n')
{
src[i] = ch;
i++;
if(i == 9)
{
printf("error!\n");
exit(1);
}
src[i] = '\0';
}
return 0;
}
//scanf的输入数组的方法
1)
#include<stdio.h>
int main()
{
int a[3];
int i;
int *p = a;
for(i = 0; i <= 2; i++)
{
scanf("%d",p++);//不可以用a++ 是因为a是常量不可以自加,*p = a 指针可以自加 p++
}
p = a;
for(i = 0;i < 3; i++)
{
printf("a[%d] = %d\n",i,*(p + i));
}
return 0;
}
2)
#include<stdio.h>
int main()
{
int a[3];
int i;
for(i = 0; i <= 2; i++)
{
scanf("%d",&a[i]);
}
p = a;
for(i = 0;i < 3; i++)
{
printf("a[%d] = %d\n",i,a[i]);
}
return 0;
}
3)
#include<stdio.h>
int main()
{
int a[3];
int i;
for(i = 0; i <= 2; i++)
{
scanf("%d",a+i);
}
p = a;
for(i = 0;i < 3; i++)
{
printf("a[%d] = %d\n",i,*(a + i));
}
return 0;
}
原文链接:https://blog.csdn.net/u011436427/article/details/82432351.
检验几个数两两不同
运用数据和数组下标的巧妙联系:
int []kk=new int[10]; //用来检验是否9个数有重复
kk[A]++;kk[B]++;kk[C]++;kk[D]++;kk[E]++;
kk[F]++;kk[G]++;kk[H]++;kk[I]++;
int i;
for(i=1;i<=9;i++)
{
if(kk[i]!=1)break;//如果有一个数重复则无效(即等于0或大于1时必然有重复)
}
//凑算式的代码如下:
#include <iostream>
using namespace std;
int a[10]; //用a数组记录ABC所代表的数 a[0]为A,a[1]为B,依此类推
int v[10]; //标记数值i是否已经被使用,未被使用v[i]为0,已经使用v[i]为1
int sum = 0; //记录满足公式的个数
void f(
int cnt) // cnt表示已经有cnt个字母已经确定好了值,等到9字母都确定,判断是否满足公式
{
if (cnt == 9) //所有字母都已经确定,进入判别公式
{
int A = a[0];
int C = a[2];
int GHI = a[6] * 100 + a[7] * 10 + a[8];
int DEF = a[3] * 100 + a[4] * 10 + a[5];
int B = a[1];
if (B * GHI + DEF * C == (10 - A) * C * GHI) {
sum++;
return;
}
}
for (int i = 1; i <= 9; i++) {
if (v[i] == 0) //判段数值i是否出现过
{
a[cnt] = i;
v[i] = 1; //标记数i已经出现过
f(cnt + 1); //递归,确定下一个位置的数值
v[i] = 0; // 回溯
}
}
}
int main() {
f(0);
printf("%d", sum);
return 0;
}
保证数据结果可靠
- 被除数乘1.0,转化为浮点型,这样可以消除5/4=1的情况。
- 形式变换,除法转换为乘法来验证,5不等于1*4。
- 用float、double等浮点型数据。
- loading…
全排列问题
参考:https://blog.csdn.net/HowardEmily/article/details/68064377.
全排列就是求一组数据的所有排列,例如 abc 的全排列为 abc、acb、bac、bca、cab、cba。
C++中的 next_permutation() 函数包含在< algorithm>里面
使用的基本格式为:
int a[];
do{ 条件和操作; } while(next_permutation(a,a + n));
- next_permutation(num,num+n)函数是对数组num中的前n个元素进行全排列,同时并改变num数组的值。
- 注意顺序,要想求出全排列,必须从字典顺序的第一个开始。
- 做题时注意!大范围数据全排列的时间复杂度太大了,很多时候都是用递归程序来代替。
一维数组的利用
一维数组有两个要素:下标、内容值。灵活地运用下标和内容值的对应关系(逻辑关系方面,抽象,一般是在脑子里明确好)来实现各种要求。
1. 描述或记录二维平面:
例如八皇后问题的一个数据结构: queen[第几行] = 第几列。同时这个下标也是一种解决问题的顺序。
2. 用于记录某种状态:
这里是内容值的 0或1 ,对应某下标的两个状态(有或没有)。
八皇后
#include <cmath>
#include <iostream>
using namespace std;
int N,sum = 0;
int queenPos[100];
void Nqueen(int k);
int main()
{
cin>>N;
Nqueen(0);
cout<<sum<<endl;
return 0;
}
void Nqueen(int k)
{
int i;
if(k==N){
sum++;
return;
}
for(i=0;i<N;i++){
int j;
for(j=0;j<k;j++)
{
//if(queenPos[j]==i||abs(queenPos[j]-i)==abs(k-j))
if(queenPos[j]==i||queenPos[j]+j==i+k||queenPos[j]-j==i-k)
break;
}
if(j==k)
{
queenPos[k] = i;
Nqueen(k+1);
}
}
}