编程题:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
#include <iostream>
using namespace std;
void f(int num)
{
if (num < 1)
return;
int sum = 0;
int j = 1;
for(int i = 1; i <=num/2+1; i++) {
sum = sum + i;
if (sum < num)
continue;
while (sum > num) {
sum = sum - j;
j++;
}
if(sum == num)
{
for(int k = j; k <= i; k++)
cout << k << " ";
cout << '\n';
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
f(15);
return 0;
}
改错题:
#include <iostream>
using namespace std;
class A
{
public:
A();
~A();
int i = 0;
static int j = 0;
const int k = 0;
const static char *p = "Hello world";
static void fun();
};
A::A()
{
}
A::~A()
{
}
static void fun()
{
}
修改后:
#include <iostream>
using namespace std;
class A
{
public:
A();
~A();
int i;
static int j;
const int k;
const static char *p;
static void fun();
};
A::A():i(0),k(0)
{
}
A::~A()
{
}
void A::fun()
{
}
int A::j = 0;
const char *A::p = "Hello world";
int main()
{
A a;
return 0;
}
写一个程序来确定系统是大端模式还是小端模式;
#include "stdafx.h"
#include <iostream>
using namespace std;
int checkCPU()
{
union {
int a;
char b;
}c;
c.a = 0x1234;
return c.b == 4;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout << checkCPU() << endl;
return 0;
}
从低到高
0010(4)1100(3)0100(2)1000(1)
编程实现采用位操作来实现整数的加法操作。
int Add(int a,int b)
{
if(b == 0) return a;//没有进位的时候完成运算
int sum,carry;
sum = a ^ b;//完成第一步没有进位的加法运算
carry=(a & b) << 1;//完成第二步进位并且左移运算
return Add(sum,carry);//进行递归,相加
}
图的矩阵表示法,图的深度优先遍历,算法思路及其实现。
深度优先遍历是连通图的一种遍历策略。其基本思想如下:
设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y)。若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边。上述过程直至从x出发的所有边都已检测过为止。
1.从0开始,首先找到0的关联顶点3
2.由3出发,找到1;由1出发,没有关联的顶点。
3.回到3,从3出发,找到2;由2出发,没有关联的顶点。
4.回到4,出4出发,找到1,因为1已经被访问过了,所以不访问。
所以最后顺序是0,3,1,2,4
#include <stdio.h>
#include <malloc.h>
#define VERTEXNUM 5
void createGraph(int (*edge)[VERTEXNUM], int start, int end);
void displayGraph(int (*edge)[VERTEXNUM]);
void DFT(int (*edge)[VERTEXNUM],int* vertexStatusArr);
void DFTcore(int (*edge)[VERTEXNUM],int i,int* vertexStatusArr);
int main(void){
//动态创建存放边的二维数组
int (*edge)[VERTEXNUM] = (int (*)[VERTEXNUM])malloc(sizeof(int)*VERTEXNUM*VERTEXNUM);
int i,j;
for(i=0;i<VERTEXNUM;i++){
for(j=0;j<VERTEXNUM;j++){
edge[i][j] = 0;
}
}
//存放顶点的遍历状态,0:未遍历,1:已遍历
int* vertexStatusArr = (int*)malloc(sizeof(int)*VERTEXNUM);
for(i=0;i<VERTEXNUM;i++){
vertexStatusArr[i] = 0;
}
printf("after init:\n");
displayGraph(edge);
//创建图
createGraph(edge,0,3);
createGraph(edge,0,4);
createGraph(edge,3,1);
createGraph(edge,3,2);
createGraph(edge,4,1);
printf("after create:\n");
displayGraph(edge);
//深度优先遍历
DFT(edge,vertexStatusArr);
free(edge);
return 0;
}
//创建图
void createGraph(int (*edge)[VERTEXNUM], int start, int end){
edge[start][end] = 1;
}
//打印存储的图
void displayGraph(int (*edge)[VERTEXNUM]){
int i,j;
for(i=0;i<VERTEXNUM;i++){
for(j=0;j<VERTEXNUM;j++){
printf("%d ",edge[i][j]);
}
printf("\n");
}
}
//深度优先遍历
void DFT(int (*edge)[VERTEXNUM], int* vertexStatusArr){
printf("start BFT graph:\n");
int i;
for(i=0;i<VERTEXNUM;i++){
DFTcore(edge,i,vertexStatusArr);
}
printf("\n");
}
void DFTcore(int (*edge)[VERTEXNUM],int i,int* vertexStatusArr){
if(vertexStatusArr[i] == 1){
return;
}
printf("%d ",i);
vertexStatusArr[i] = 1;
int j;
for(j=0;j<VERTEXNUM;j++){
if(edge[i][j] == 1){
DFTcore(edge, j, vertexStatusArr);
}
}
}
#include "stdafx.h"
#include <iostream>
using namespace std;
#define MAX_VERTEX_NUM 10 //最大顶点个数
typedef char VERTYPE;
typedef struct
{
char vexs[10]; //顶点向量
int arcs[10][10]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
}mgraph, * MGraph;
void init_mgraph(MGraph &g) //初始化图
{
g=(MGraph)malloc(sizeof(mgraph));
g->vexnum=0;
g->arcnum=0;
for(int i=0;i<10;i++)
g->vexs[i]=0;
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
g->arcs[i][j]=0;
}
void add_vexs(MGraph &g) //增加顶点
{
cout<<"请输入顶点的个数:"<<endl;
cin>>g->vexnum;
cout<<"请输入顶点的值"<<endl;
for(int i=0;i<g->vexnum;i++)
{
cin>>g->vexs[i];
}
}
void add_arcs(MGraph &g) //增加边
{
cout<<"请输入边的个数:"<<endl;
cin>>g->arcnum;
char ch1,ch2;
int row,col;
for(int i=0;i<g->arcnum;i++)
{
cin>>ch1>>ch2;
for(int j=0;j<g->vexnum;j++)
{
if(g->vexs[j]==ch1)
{
row=j;
}
if(g->vexs[j]==ch2)
{
col=j;
}
}
g->arcs[row][col]=1; //有向带权图只需把1改为weight
g->arcs[col][row]=1; //无向图加上此行
}
}
void creat_mgraph(MGraph &g) //创建图
{
add_vexs(g); //增加顶点
add_arcs(g); //增加边
}
void print_mgraph(MGraph &g) //打印图
{
for(int i=0;i<g->vexnum;i++)
cout<<" "<<g->vexs[i];
cout<<endl;
for(int i=0;i<g->vexnum;i++)
{
cout<<g->vexs[i]<<" ";
for(int j=0;j<g->vexnum;j++)
{
cout<<g->arcs[i][j]<<" ";
}
cout<<endl;
}
}
//删除顶点
void delete_vex(MGraph &g,char ch)
{
int row;
int i,j;
for(i=0;i<g->vexnum;i++)
{
if(g->vexs[i]==ch)
{
row=i;
}
}
int arcs=0; //记录删除顶点的弧数,然后总弧数减去此值
for(i=0;i<g->vexnum;i++)
{
if(g->arcs[row][i] == 1)
arcs++;
}
for(i=0;i<g->vexnum;i++)
{
for(j=row;j<g->vexnum-1;j++)
g->arcs[i][j]=g->arcs[i][j+1]; //把删除顶点右边的数据左移
g->arcs[i][j+1]=0;
}
for(i=row;i<g->vexnum-1;i++)
{
for(j=0;j<g->vexnum;j++)
g->arcs[i][j]=g->arcs[i+1][j]; //把删除顶点下边的数据上移
g->arcs[i+1][j]=0;
}
for(i=row;i<g->vexnum-1;i++) //把顶点数组中右边的顶点左移
g->vexs[i]=g->vexs[i+1];
g->vexnum=g->vexnum-1; //顶点个数减1
g->arcnum=g->arcnum-arcs; //总弧数减去要删除顶点的弧数
}
int main()
{
MGraph G;
init_mgraph(G); //初始化图
creat_mgraph(G); //创建图
print_mgraph(G); //打印图
//删除顶点
char ch;
cin>>ch;
delete_vex(G,ch);
cout<<G->arcnum<<" "<<G->vexnum<<endl;
print_mgraph(G);
return 0;
}