算法小组第三次交流会代码(算法入门第二章 刘汝佳版)
包含第三章全部例题及部分习题代码,并用c++改写
今天看到一句感觉很有道理的话:“C++语言名字里的‘++’就是常用的‘++’运算符。”,本人也确切能体会到,C++源于C,而后又高于C。
程序 3-1 逆序输出(有输入问题)
比较大的数组应该尽量声明在main函数外,否则程序可能无法运行。
#include<stdio.h>
//#include<cstdio>
using namespace std;
const int maxn=105;
int a[maxn];
int main()
{
int x,n=0;
while(scanf("%d",&x)==1)
{
a[n++]=x;
}
for(int i=n-1;i>=1;i--)
{
printf("%d",a[i]);
}
printf("%d",a[0]);
return 0;
}
程序 3-2 开灯问题
说来惭愧,调试了好一会儿发现是a[j]=!a[j]处出了问题,写成了a[j]=!a[i],浪费时间了。
#include<iostream>
using namespace std;
const int maxn=1050;
int a[maxn]={0}; //定义灯0为关,1为开
int main()
{
int n,k;
cin>>n>>k; //有几盏灯和几个人
for(int i=1;i<=k;i++) //遍历每个人
{
for(int j=1;j<=n;j++) //遍历每盏灯,并巧妙利用人数和灯数的关系
{
if(j%i==0) //若满足条件,进行操作
{
a[j]=!a[j]; //开关灯操作
}
}
}
for(int i=1;i<=n;i++) //遍历每盏灯输出亮着的灯
{
if(a[i])
cout<<i<<" ";
}
return 0;
}
程序 3-3 蛇形填数
C/C++支持连续赋值,例如a=b=1; 但是其中变量b应该提前声明,若为:int a=b=1;(b未声明,未分配地址)则为错误。
#include<string>
#include<iostream>
const int maxn=20;
int a[maxn][maxn]={0};
using namespace std;
int main()
{
int n,x,y,tot=0;
cin>>n;
tot=a[x=0][y=n-1]=1; //初始化第一个
while(tot<n*n)
{
while(x+1<n && !a[x+1][y]) a[++x][y]=++tot; //下
while(y-1>=0 && !a[x][y-1]) a[x][--y]=++tot; //左
while(x-1>=0 && !a[x-1][y]) a[--x][y]=++tot; //上
while(y+1<n && !a[x][y+1]) a[x][++y]=++tot; //右
}
for(x=0;x<n;x++) //循环遍历输出
{
for(y=0;y<n;y++)
{
printf("%4d",a[x][y]); //保持字长,printf更为方便
}
cout<<endl;
}
return 0;
}
程序3-4 竖式问题
方法论:两种方法让scanf遇到空格继续输入字符串
1、gets()函数 ,用gets()替代scanf();
gets可以无限读取字符串,不会判断上限,以回车结束读取。其用法为gets(s),其中s为字符串变量(字符串数组名或字符串指针)。简单的理解就是读入一串字符(遇到回车结束),存到s中。
#include<stdio.h>
int main()
{
char str[50];
gets(str);
printf("%s\n",str);
return 0;
}
2、scanf("%[^\n]",str) ,遇到"\n"结束
'^'含有非的意思
“%[^\n]“即遇到\n结束。
如果使用”%[^v]”,那我们输入 “I love you!” ,输出的就是 “I lo”
#include<stdio.h>
int main()
{
char str[50];
scanf("%[^\n]",str);//"%[^v]"
printf("%s\n",str);
return 0;
}