汉诺塔
#include<iostream>
#include<string.h>
using namespace std;
int ci;
void hannuota(int,char,char,char);
int main()
{
int n;
char x='A',y='B',z='C';
cout<<"请输入盘子数";
cin>>n;
hannuota(n,x,y,z);
cout<<"共移动"<<ci<<"次";
} ;
void hannuota(int n,char x,char y,char z)
{
if(n==1)
{
cout<<x<<"---->"<<z<<endl;ci++;
}
else
{
hannuota(n-1,x,z,y);
cout<<x<<"---->"<<z<<endl;ci++;
hannuota(n-1,y,x,z);
}
}
洗牌
据说有一种洗牌机按照如下的要求洗牌:假设有 2n 张牌,在开始时以 1, 2, ……,n, n+1,……,2n 编号的顺序排列。一次洗牌就是将牌原来的次序变为 n+1,1,n+2, 2,……,2n,n,也就是将原来的前 n 张牌放到位置 2, 4,……,2n,并且将余下的 n 张牌按照他们原来的次序放到奇数位置 1,3,……,2n-1。已经证明对于任何一个自然数 n,这 2n 张牌经过一定次数的洗牌就回到原来的次序。你知道对于一个特定的n,需要几次洗牌才能将牌洗回原来的次序吗?
#include<iostream>
#include<string.h>
#include<iomanip>
using namespace std;
int panduan(int a[],int p);
void xipai(int a[],int b[],int n);
int main(){
int i,p,t,n;
int a[100],b[100];
cout<<"请输入牌数的一半n\n";
cin>>n;
p=2*n;
cout<<"总牌数"<<p<<endl;
for(i=0;i<p;i++){
a[i]=i+1;
b[i]=a[i];
}
cout<<"初始数组:";
for(i=0;i<p;i++){
cout<<setw(3)<<b[i];
}
cout<<endl;
xipai(a,b,n);
t=1;
while(panduan(a,p)==1){
for(i=0;i<p;i++){
b[i]=a[i];}
xipai(a,b,n);
t++;
}
cout<<endl<<"次数"<<t;
}
int panduan(int a[],int p){
int i;
for(i=0;i<p;i++){
if (a[i]==i+1)
{
return 0;
}
return 1;
}
}
void xipai(int a[],int b[],int n){
int i;
for(i=0;i<n;i++)
{
a[2*i]=b[n+i];
a[i*2+1]=b[i];
}
}
折半查找
#include<iostream>
using namespace std;
int zb_search(int *p,int n,int x);
int main(){
int a[100],n,i,target;
cout<<"请输入数组长度:";
cin>>n;
cout<<"请输入一组有序数据从大到小:";
for(i=0;i<n;i++){
cin>>a[i];
}
cout<<"请输入目标:";
cin>>target;
if(zb_search(a,n,target)!=-1)
cout<<"该数在数组中的位置:"<<zb_search(a,n,target);
else
cout<<"该数不存在";
cout<<endl;
}
int zb_search(int *p,int n,int x){
//将数组a的首地址传递给*p,下面用指针进行操作
int mid,low,high;
low=0;
high=n-1;
while(low<=high){
mid=(low+high)/2;
if(p[mid]>x)// 往左区间找,左边小
low=mid+1;
else if(p[mid]<x)//往右区间找,右边大
high=mid-1;
else
return mid+1;//找到了,数组元素下标加一为当前位置
}
return -1;//没找到
}
计算若干学生的平均成绩(结构体的运用)
#include<iostream>
using namespace std;
struct student{
int sno;
char name[10];
float grade[3];
};
void avg(student st[],int n){
int i,j,pinj;
for(i=0;i<n;i++){
pinj=0;
for(j=0;j<3;j++){
pinj=pinj+st[i].grade[j];//将每个学生的三项成绩相加
}
cout<<"第"<<i+1<<"名同学平均成绩为:"<<float(pinj/3);
cout<<endl;
}
}
int main(){
student xues[100];
int i,j,n;
cout<<"请输入学生数";
cin>>n;
for(i=0;i<n;i++){
cout<<"第"<<i+1<<"学号 姓名 成绩";//给结构成员赋值
cin>>xues[i].sno;
cin>>xues[i].name;
for(j=0;j<3;j++)
cin>>xues[i].grade[j];
}
avg(xues,n);
}
计算候选人得票数(使用结构体,假设一共三名候选人)
#include<iostream>
#include<string.h>
using namespace std;
struct hxren{
//结构体定义
char name[100];
int depiao;
};
int main(){
int i,num;
char piao[100];
hxren person[3];
for(i=0;i<3;i++){
cout<<"第"<<i+1<<"候选人:";
cin>>person[i].name;//给name分量赋值即名字
}
cout<<"总票数";
cin>>num;
for(i=1;i<=num;i++){
cout<<"第"<<i<<"票投给:";
cin>>piao;
if(strcmp(piao,person[0].name)==0)//判断具体投票投给了谁 strcmp函数用于判断字符串是否相等,相等为0
person[0].depiao++;
else if(strcmp(piao,person[1].name)==0)
person[1].depiao++;
else if(strcmp(piao,person[2].name)==0)
person[2].depiao++;
else {
cout<<"falut"<<endl;
i--;
}
}
for(i=0;i<3;i++)
cout<<person[i].name<<"得票数:"<<person[i].depiao<<endl;
}
指针法
#include<iostream>
#include<string.h>
using namespace std;
struct person{
char name[20];
unsigned int count;
};
void jieguoti ( person *p,int n,int m){
int i,j;
char piao[20];
for(i=0;i<m;i++){
cout<<"请输入第"<<i+1<<"票";
cin>>piao;
for(j=0;j<n;j++){
if(strcmp(piao,(p+j)->name)==0)//->是结构体指针访问结构元素方法
(p+j)->count++;
}
}
for(i=0;i<3;i++)
cout<<(p+i)->name<<"得票数:"<<(p+i)->count<<endl;
}
int main(){
int i,j;
person leader[3]={
"li",0,"zhang",0,"fun",0};
cout<<"请输入选票数";
cin>>i;
jieguoti(leader,3,i);
}
利用指针进行字符串复制
#include<iostream>
using namespace std;
void string_copy(char *s1,char *s2);
int main(){
char a[20]="abcds";
char b[20];
cout<<a<<" ";
string_copy(b,a);
cout<<b<<endl;
}
void string_copy(char *s1,char *s2){
while(*s1++=*s2++);
}
利用指针实现字符串排序
#include<iostream>
#include<string.h>
using namespace std;
void sort1(char const *name[],int n);
int main(){
char const *name[4]={
"sfsa","fdsa","tyss","dsax"};
sort1(name,4);
}
void sort1(char const*name[],int n){
char const *temp; int i, j, k;
for (i = 0; i < n-1; i++)
{
k = i;
for (j = i + 1; j < n; j++)
{
if(strcmp(name[k], name[j]) > 0)
k = j;
}
if(k!=i)
{
temp = name[i];
name[i] = name[k];
name[k] = temp;
}
for(i=0;i<n;i++){
cout<<name[i]<<" ";
}
}}
指针统计单词个数(单词间空格隔开)
#include<iostream>
#include<cstring>
using namespace std;
int tongji (char *s);
int main(){
char zf[100];
cout<<"请输入一行连续的单词";
gets(zf);
cout<<"单词个数"<<tongji(zf);
}
int tongji (char *s){
int i;
int flat=1,c=0;
for(i=0;s[i]!='\0';i++){
if(s[i]==' ')
flat=1;
else if(flat==1&&s[i]!=' '){
flat=0;
c++;
}
}
return c;
}
字符串之无重复字符的最长子串
#include<iostream>
using namespace std;
int lengthOfLongestSubstring(char * s){
int max_size = 0;
int cur_size = 0;
if(s == NULL)
return 0;
if(s[0] == '\0')
return 0;
int l = 0; // 用来存放子串最左边的位置
int r = 1; // 用来存放子串右边位置,这个值不断右移,移动一次就与前面l位置开始到r-1的位置的值比较。
while(s[r] != '\0')
{
for(int i=l; i<r; i++)
{
if(s[r] == s[i]) // 找到相同的值
{
cur_size = r - l;
l = i+1; // 更新l的位置
if(max_size < cur_size)
max_size = cur_size;
}
}
r++;
}
cur_size = r-l;
if(max_size < cur_size)
max_size = cur_size;
return max_size;
}
int main(){
char s[100]="abbdecbbcfasknwesjens";
cout<<lengthOfLongestSubstring(s);
}