// ConsoleAppIsPrime1.cpp : 定义控制台应用程序的入口点。
//
/*
*函数功能:判断一个输入的数是否为素数
*函数原形:bool Prime( int x )
*参数:int x:将要判断的数
*返回值:bool型变量,判断是否是素数
*备注:需要包含头文件
*日期:2014/11/25
*原创:否
*作者:EbowTang
*Email:[email protected]
*/
#include "stdafx.h"
#include "math.h"
#include "iostream"
using namespace std;
bool Prime( int x );
int _tmain(int argc, _TCHAR* argv[])
{
bool flag;
int a;
while (true)
{
cout<<"Please enter a number:";
cin>>a;
flag=Prime(a);
if (flag==true)
cout<<"Prime!!!"<
// ConsoleAppIsPrime.cpp : 定义控制台应用程序的入口点。
//
/*
*函数功能:判断指定范围内素数个数
*函数原形:int Primes( int n ,int m )
*参数:
int n:请输入想要确认的素数范围下限
int m:请输入想要确认的素数范围上限
*返回值:n到m范围内素数的个数
*备注:
*日期:2014/11/25
*原创:是
*作者:EbowTang
*Email:[email protected]
*/
#include "stdafx.h"
#include "iostream"
#include "math.h"
using namespace std;
int Primes( int n ,int m );
bool Prime( int x );
int _tmain(int argc, _TCHAR* argv[])
{
int countprimes=0;
int a=0;
int b=0;
while (true)
{
cout<<"请输入想要确认的素数范围上限:";
cin>> a ;
cout<<"请输入想要确认的素数范围下限:";
cin>> b;
countprimes=Primes(a,b);
cout<<"在 "<< a <<"到 "<< b <<"之间的素数个数为: "<< countprimes<
/*
*函数功能:判断一个整数是否为2的次幂
*函数原形:bool IsTwoN(int n);
*参数:int n,要判断的整数
*返回值:bool型变量,表征是与否
*时间复杂度:O(1)
*备注:无
*日期:2014/11/23
*原创:否
*作者:EbowTang
*Email:[email protected]
*/
#include "stdafx.h"
#include "iostream"
#include "math.h"
using namespace std;
bool IsTwoN(int n);
int _tmain(int argc, _TCHAR* argv[])
{
while(1)
{
bool flag;
int m;
cout<<"请输入一个整数:"<>m;
flag=IsTwoN(m);
if (flag==true)
cout<0&&((n&(n-1))==0))/*第一种方法*/
//如果n==2的log以2为底数的n对数的pow函数后,则是
if (n==pow(2,(int)(log10(n)/log10(2.))))/*第二种方法*/
return true;
else
return false;
}
/*
*函数功能:求取整数对应二进制数中1的个数
*函数原形:int Count(int z);
*参数:int z,要计算的整数
*返回值:返回整数对应二进制数中1的个数
*时间复杂度:O(1)
*备注:无
*日期:2014/11/23
*原创:否
*作者:EbowTang
*Email:[email protected]
*/
#include "stdafx.h"
#include "iostream"
using namespace std;
int Count(int z);
int main()
{
int number;
int z;
char asn='n';
do
{
cout<<"请输入一个整数:"<>z;
number=Count(z);
cout<<"该整数对应二进制数1的个数为:"<>asn;
} while (asn=='y');
return 0;
}
int Count(int v)
{
int num=0;
while (v)
{
//第一种算法:复杂度较低
// num+=v & 0x01;
// v >>=1;
//第二种算法:
// v&=(v-1);
// num++;
/*第三种算法:算法复杂度较高*/
if(v%2==1)
num++;
v=v/2;
}
return num;
}
// ConsoleAppDigitCount.cpp : 定义控制台应用程序的入口点。
//
/*
*问题描述:用随机函数生成100个在100到999之间的整数,设计程序统计这些三位数中十位是分别是0-9出现次数
*问题示例:无
*函数功能:统计三位数中十位数0-9出现的次数
*函数原形:void DigitCount(int num[], int count[])
*参数:int num[], 欲统计的数组,int count[]存储统计结果
*返回值: 无
*时间复杂度:O(n)
*备注:无
*日期:2014/12/31
*算法描述:
*/
#include "stdafx.h"
#include "iostream"
#include
#include
#include
using namespace std;
#define MAX 100
using namespace std;
/*
*函数功能:生成100到999的随机整数数
*函数原形:void RandNumIn(int num[])
*参数:int num[],用于存储随机整数
*返回值:无
*/
void RandNumIn(int num[])
{
srand((unsigned)time(NULL)); //设置随机种子
for( int i=0; i
// ConsoleAppHexadecimalTrans.cpp : 定义控制台应用程序的入口点。
//
/*
*问题描述:将十进制转换成二进制或者八进制,16进制
*问题示例:输入50 2,输出110010
*函数功能:
*函数原形:void HexadecimalTrans(int n, int d)
*参数:int n,十进制整数 int d,进制数
*返回值:无
*时间复杂度:
*备注:无
*日期:2014/11/30
*算法描述:
*/
#include "stdafx.h"
#include
using namespace std;
int flag=1;
void HexadecimalTrans(int n, int d)
{
int mod;
mod=n%d; //n表示数字,d表示进制
n=n/d;
while(flag && n) //辗转相除
HexadecimalTrans(n,d);
switch(mod)
{
case 10:
cout<<"A";
break;
case 11:
cout<<"B";
break;
case 12:
cout<<"C";
break;
case 13:
cout<<"D";
break;
case 14:
cout<<"E";
break;
case 15:
cout<<"F";
break;
default:
cout<>n;
cout<<"请输入将要进行的进制转换(2,8,16):"<>d;
HexadecimalTrans(n,d); //调用转换函数
cout<
// ConsoleAppSpecifiedSearch.cpp : 定义控制台应用程序的入口点。
//
/*
*问题描述:暴力搜索遍历查找,从100个随机函数中(100-999)查找指定数字的位置
*问题示例:
*函数功能:查找指定的数
*函数原形:int FindNum(int num[], int x)
*参数:int num[],要查找的数组, int x,要查找的数
*返回值:数字的位置
*时间复杂度:O()
*备注:无
*日期:2014/7/30
*算法描述:
*/
#include "stdafx.h"
#include
#include
#include
using namespace std;
#define MAX 100
/*
*函数功能:产生指定的随机数
*函数原形:void RandNumIn(int num[])
*参数:int num[],产生的随机数保存到数组num中
*返回值:无
*/
void RandNumIn(int num[])
{
int i;
srand((unsigned)time(NULL)); //得到随机种子
for(i=0; i>x;
pos=FindNum(num, x); //调用查找函数
if(pos)
cout<<"太好了!"<
// ConsoleAppSpecifiedSearch.cpp : 定义控制台应用程序的入口点。
//
/*
*问题描述:二分法遍历查找,从100个随机函数中(100-999)查找指定数字的位置
*问题示例:
*函数功能:二分查找法查找指定的数
*函数原形:int SpecialFindNum(int num[], int x, int low, int high)
*参数:
int num[],要查找的数组,
int x,要查找的数
int low, 查找的起始位置
int high,查找的末端位置
*返回值:数字的位置
*时间复杂度:O()
*备注:无
*日期:2014/7/30
*算法描述:
*/
#include "stdafx.h"
#include
#include
#include
using namespace std;
#define MAX 101
/*
*函数功能:产生指定的随机数
*函数原形:void RandNumIn(int num[])
*参数:int num[],产生的随机数保存到数组num中
*返回值:无
*/
void RandNumIn(int num[])
{
int i;
srand((unsigned)time(NULL)); //得到随机种子
for(i=1; i=num[0])
h--; //利用快速排序是数据有序
num[l]=num[h];
while(l>x;
pos=SpecialFindNum(num, x, 1, MAX-1); //调用查找函数
if(pos)
cout<<"太好了!"<
// ConsoleAppCharCount.cpp : 定义控制台应用程序的入口点。
//
/*
*问题描述:设计一个程序,统计随机给出的字符串的数字的个数,字母的个数,特殊字符的个数
*问题示例:123asd,数字3,字母3,特殊字符0
*函数功能:统计字符串中的数据
*函数原形:void CharCal(char *str, int count[])
*参数:char *str,欲统计的字符串, int count[],用于存储统计结果
*返回值:无
*时间复杂度:O()
*备注:无
*日期:2014/7/30
*算法描述:
*/
#include "stdafx.h"
#include
#include
#define MAX 1024
using namespace std;
/*
*函数功能:统计字符串中的数据
*函数原形:void CharCal(char *str, int count[])
*参数:char *str,欲统计的字符串, int count[],用于存储统计结果
*返回值:无
*/
void CharCal(char *str, int count[])
{
while(*str)
{
if((*str>='0')&&(*str<='9')) //统计数字型字符
count[0]++;
else if(((*str>='a')&&(*str<='z')) || ((*str>='A')&&(*str<='Z'))) //统计字符型字符
count[1]++;
else //其他特殊字符
count[2]++;
str++;//指针移动
}
}
/*
*函数功能:输出统计结果
*函数原形:void CharCount( int count[])
*参数: int count[],存储统计结果的数组
*返回值:无
*/
void CharCount( int count[])
{
for(int i=0; i<3; i++)
{
switch(i)
{
case 0:
cout<<"数字:"<数字; 1->字符; 2->其他
memset(count, 0, 3*sizeof(int)); //初始化统计数组
cout<<"输入字符串: "<>str;
CharCal(str, count);//统计
CharCount(count);//输出显示
system("pause");
return 0;
}
// ConsoleAppCharTest.cpp : 定义控制台应用程序的入口点。
//
/*
*问题描述:输入字符串,将其逆序输出
*问题示例:输入,asdfgh,输出hgfdsa
*函数功能:逆序输出字符串的内容
*函数原形:void Reverse( char* s, int left, int right );
*参数:
char *,欲逆序的字符串,
int left, 逆序的左起点
int right,逆序的右尾点
*返回值:无
*时间复杂度:O(n)
*备注:无
*日期:2014/7/30
*算法描述:
*/
#include "stdafx.h"
#include
using namespace std;
void Reverse( char* s, int left, int right );
int _tmain(int argc, _TCHAR* argv[])
{
int len;
char a[100];
while(1)
{
cout<<"请输入字符串a:"<>a;
len=strlen(a);
Reverse(a,0,len-1);
for(int i=0;i= right)
return;
char t = s[left] ;
s[left] = s[right] ;
s[right] = t ;
Reverse(s, left + 1, right - 1) ;
}
/*
//算法二:与上面的方法没有太大区别
void Reverse( char* s, int left, int right )
{
while( left < right )
{
char t = s[left] ;
s[left++] = s[right] ;
s[right--] = t ;
}
}*/
// ConsoleAppCharTest.cpp : 定义控制台应用程序的入口点。
//
/*
*问题描述:输入两个字符串,判断相互之间字符串是否包含
*问题示例:输入,asdfgh,输出asd,结果,包含!
*函数功能:判断两个字符串是否包含
*函数原形:bool IsContain(char *pStrA, char *pStrB);
*参数:
char *pStrA, 第一个字符串
char *pStrB,第二个字符串
*返回值:布尔变量
*时间复杂度:O(n)
*备注:无
*日期:2014/7/30
*算法描述:
*/
#include "stdafx.h"
#include "iostream"
using namespace std;
bool IsContain(char *pStrA, char *pStrB);
int _tmain(int argc, _TCHAR* argv[])
{
char a[10],b[10];
bool flag;
while(true)
{
cout<<"Please Enter characters A:"<>a;
cout<<"Please Enter characters B:"<>b;
flag=IsContain(a, b);
if (flag==false)
cout<<"Not Contain!"<
比如3位的所有格雷码:
000
001
011
010
110
111
101
100
代码如下:
// ConsoleAppGrayCode.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
bool GrayCode(int nBits);
int changeBit(int a);
int _tmain(int argc, _TCHAR* argv[])
{
int nBits=0;
cout<<"请输入位元长度:"<>nBits;
GrayCode(nBits);
system("pause");
return 0;
}
bool GrayCode(int nBits)
{
bool flag=true;
do
{
if (nBits<0)
{
cout<<"你的输入有误,请重新输入:"<>nBits;
}else
{
flag=false;
}
} while (flag);
int *pGray=new int[nBits];
for (int i=0;i=0;j--)
{
if (pGray[j]==1)
{
pGray[j-1]=changeBit(pGray[j-1]);
break;
}
}
for (int i=0;i
#include
using namespace std;
#define CHANGE_BIT(a) a=((a=='0')? '1':'0') //定义宏实现改变位元值
#define NEXT_BIT(x) x=(1-(x)) //设定奇数项或偶数项
/***************构建n位元的格雷码***************/
void findGrayCode(int n){
if (n <=0)
{
cout<<"输入超出有效范围"<=0;i--) //输出改格雷码
{
cout<>n;
cout<
N个人围成一圈,从第一个开始报数,第M个将出局,最后剩下一个,其余人都将出局。
例如N=6,M=5,被出局的顺序是:5,4,6,2,3,1。
(1)CircleList.h的代码如下:
#include "stdafx.h"
#include "iostream"
using namespace std;
templateclass LinkList;
template
class LinkNode
{
public:
LinkNode()
{
next = NULL;
data = 0;
}
//函数参数表中的形参允许有默认值,但是带默认值的参数需要放后面
LinkNode(DataType item)
{
next = NULL;
data = item;
}
friend class LinkList;
private:
DataType data;
LinkNode *next;
};
/* 带头结点的单链表定义 */
template
class LinkList
{
public:
//无参数的构造函数
LinkList(int size)
{
head = new LinkNode;//头结点
maxSize=size;
nLength=0;
}
//析构函数
~LinkList()
{
}
//获取链表长度
int Length() const
{
return nLength;
}
//定位指定的位置,返回该位置上的结点指针
LinkNode* Locate(int pos);
//在指定位置pos插入值为item的结点,失败返回false
bool Insert(DataType item, int pos);
//打印链表
void Print() const;
//创建一个链表环
void CreatCircle();
//判断是否纯在单链表环
bool IsCircle();
//数数移动
bool CountMove( int nStep=0 ,int i=0 );
private:
LinkNode *head;
int maxSize;
int nLength;
};
/* 返回链表中第pos个元素的地址,如果pos<0或pos超出链表最大个数返回NULL */
template
LinkNode* LinkList::Locate(int pos)
{
LinkNode *p = head;//head和p指向共同的内容,头结点无数据,只是个指针
if (pos < 0)
{
cerr<<"位置参数有错误"<next;
i++;
}
return p;
}
template
bool LinkList::Insert(DataType item, int pos)
{
if (Length() >= maxSize)
{
cout<<"错误:链表已满"< *p = Locate(pos);
LinkNode *newNode = new LinkNode(item);//创建新节点
if (NULL == newNode)
{
cerr << "分配内存失败!" << endl;
exit(1);
}
newNode->next = p->next;
p->next = newNode;
nLength++;
return true;
}
template
void LinkList::Print() const
{
int count = 0;
LinkNode *p = head;
while (NULL != p->next)
{
p = p->next;
std::cout << p->data << " ";
if (++count % 15 == 0) //每隔十个元素,换行打印
cout << std::endl;
}
}
//创建一个链表环
template
void LinkList:: CreatCircle()
{
int nLen=Length();
int nLen1=1;
LinkNode *ptail=Locate(nLen);
LinkNode *pcirStart=Locate(nLen1);
ptail->next=pcirStart;
}
//是否纯在链表环?
template
bool LinkList::IsCircle()
{
if ( head ==NULL)
{
cerr<<"空链表"< *pFast,*pSlow;
pSlow=head;
pFast=head;
while(pFast!=NULL&&pFast->next!=NULL)
{
pFast=pFast->next->next;
pSlow=pSlow->next;
if (pSlow==pFast)
{
return true;
break;
}
}
return false;
}
template
bool LinkList::CountMove( int nStep,int k)//指定出局人数
{
if ( k > Length() )
{
cerr<<"写你麻痹,滚回去检查!"< *pCurr=NULL,*pPrev=NULL;
int i = 0; // 计数
int n=0;
pCurr = pPrev = head;
while( n < k )
{
if (i == nStep)
{
// 踢出环
cout<<"第 "<data<next = pCurr->next;
delete pCurr;
pCurr = pPrev->next;
i = 1;
n++;
}
pPrev = pCurr;
pCurr = pCurr->next;
if (pPrev == pCurr)
{
// 最后一个
cout<<"第 "<data<<" "; // 显示出圈循序
delete pCurr;
//最后一个节点删除后的“擦屁股”处理
pCurr=NULL;
head->next=head;
n++;
break;
}
i++;
}
return true;
}
(2)主测试代码:
// Win32AppCircleOut.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "CircleList.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int nlen=10;
LinkList s(nlen);
for (int i=0;i
汉诺塔递归问题:
// ConsoleAppHanoi.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
int Hanoicount=0;
bool HanoiMove(int n,char a,char b,char c);//将n个盘从a借助b移动到c
int _tmain(int argc, _TCHAR* argv[])
{
HanoiMove(5,'A','B','C');
cout<<"共进行了:"<"<"<
/ ConsoleAppRunNian.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
#include "windows.h"
using namespace std;
int leap(int a) /*自定义函数leap用来指定年份是否为闰年*/
{
if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0) /*闰年判定条件*/
return 1; /*是闰年返回1*/
else
return 0; /*不是闰年返回0*/
}
int number(int year, int m, int d) /*自定义函数number计算输入日期为该年第几天*/
{
if ( m>12 || d > 31 || d < 0 || m<0)
{
cerr<<"参数错误!"< 29)
{
cerr<<"参数错误!"<>year>>month>>day; /*输入年月日*/
n = number(year, month, day); /*调用函数number*/
while (n == -1)
{
cout<<"请重新输入年月日"<>year>>month>>day; /*输入年月日*/
n = number(year, month, day); /*调用函数number*/
}
cout<<"第"<
婚礼上的谎言
// ConsoleAppHunLi.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
#include "windows.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int a, b, c;
for (a = 1; a <= 3; a++) /*穷举a的所有可能*/
for (b = 1; b <= 3; b++) /*穷举b的所有可能*/
for (c = 1; c <= 3; c++) /*穷举c的所有可能*/
if (a != 1 && c != 1 && c != 3 && a != b && a != c && b != c)
/*如果表达式为真,则输出结果,否则继续下次循环*/
{
cout<
// ConsoleAppMatTrans.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
/******************
定义二维数组char array[x][y];
1.只定义个一维的就可以了
char *array;
array = new char[x*y]; 这种方式等价于char *array = new char[x*y];
访问的时候*(array+i*y+j)表示array[i][j]
2.定义一个二维数组
char **array1
array1 = new char *[x];
for(i=0;i>row>>col;
mat =new int*[row];//二维数组的每行的指针
cout<<"请输入二维数组:"<>mat[i][j];
}
}
cout<<"二维数组为:"<
定义:二进制长度就是最高位1的下标值+1(下标从0开始),比如16 = 10000,则长度是5, 2= 0010,长度为2
#include "stdafx.h"
#include "iostream"
using namespace std;
int BitLength(unsigned int n);
int _tmain(int argc, _TCHAR* argv[])
{
int count=0,a;
do
{
cout<<"请输入一个整数"<>a;
count=BitLength(a);
cout<<"该整数对应二进制数的长度为:"<0);
return 0;
}
//算法一:易阅读
int BitLength(unsigned int n)
{
int c = 0 ; //计数
while (n)
{
++c ;
n >>= 1 ;
}
return c ;
}
//算法二:与上面的解法本质一样
int BitLength(unsigned int n)
{
return n ? BitLength1(n >>=1) + 1 : 0 ;
}
//算法三:以空间换时间(参考网络)
int BitLength(unsigned int n)
{
// pow of 2, 2^0 - 2 ^31
int powof2[32] =
{
1, 2, 4, 8, 16, 32,
64, 128, 256, 512, 1024, 2048,
4096, 8192, 16384, 32768, 65536, 131072,
262144, 524288, 1048576, 2097152, 4194304, 8388608,
16777216, 33554432, 67108864, 134217728, 268435456, 536870912,
1073741824, 2147483648
} ;
int left = 0 ;
int right = 31 ;
while (left <= right)
{
int mid = (left + right) / 2 ;
if (powof2[mid] <= n)
{
if (powof2[mid + 1] > n)
return mid + 1; // got it!
else // powof2[mid] < n, search right part
left = mid + 1 ;
}
else // powof2[mid] > n, search left part
right = mid - 1 ;
}
return -1 ;
}
碾转相除法:假设f(a,b)是a,b的最大公约数,则f(b,a%b)=f(a,b),即f(b,a%b)同样也是其最大公约数
#include "stdafx.h"
#include
using namespace std;
int GyueNum(int x,int y);
int main()
{
int a,b,result;
cout<<"请输入两个任意的整数"<>a>>b;
result=GyueNum(a,b);
cout<
// ConsoleAppStackTest1.cpp : 定义控制台应用程序的入口点。
//
/*
*函数功能:以 23 56 11 4 87 98入栈,以11 4 56 98 87 23出栈
*函数原形:无
*参数:无
*返回值:无
*时间复杂度:无
*备注:无
*日期:2014/12/13
*原创:是
*作者:EbowTang
*Email:[email protected]
*/
#include "stdafx.h"
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//顺序入栈,三个参数
stack sta;
sta.push( 23 );
sta.push( 56 );
sta.push( 11 );
cout << sta.top( )<< " ";//输出顶值11
sta.pop( );//删除元素11
sta.push( 4 );
cout << sta.top( )<< " ";//输出顶值4
sta.pop( );//删除元素4
cout << sta.top( ) << " ";//输出顶值56
sta.pop( );//删除元素56
sta.push( 87 );
sta.push( 98 );
cout << sta.top( ) << " ";//输出顶值98
sta.pop( );//删除元素98
cout << sta.top( ) << " ";//输出顶值87
sta.pop( );//删除元素87
cout << sta.top( ) << " ";//输出顶值23
system( "PAUSE" );
return EXIT_SUCCESS;
}
3 [(]) (]) ([[]()])
No No Yes
“括号配对”代码实现如下:
#include "iostream"
#include "string"
#include "stack"
using namespace std;
bool BracketMatch(const string srcStr);
int _tmain(int argc, _TCHAR* argv[])
{
system("color 0A");
int N = 0;
//申请内存
string src;
while (cin>>N)
{
for (size_t i = 0; i < N; i++)
{
cin >> src;
if (BracketMatch(src))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}
return 0;
}
bool BracketMatch(const string srcStr)
{
stack s;
//例子[]()[];
if (srcStr[0] == ')' || srcStr[0] == ']')//如果第一个字符就是右括号,则直接pass掉
return false;
for (unsigned int i = 0; i < srcStr.length(); i++)//从左往右开始遍历
{
switch (srcStr[i])
{
//对左括号仅作压栈处理,同时值得注意的是栈中只有左括号
case '[':
s.push(srcStr[i]);
break;
case '(':
s.push(srcStr[i]);
break;
//对于右括号总是判断他是否与栈顶元素配对,否则即可判断不配对
case ']':
if (s.top() == '[')
s.pop();
break;
case ')':
if (s.top() == '(')
s.pop();
break;
default:
cerr << "错误的括号" << endl;
exit(1);
}
}
//判断栈中的情况
if (s.empty())
return true;
else//如果栈中有数据则说明存在不匹配
return false;
}
2 10 14
1 3 5 7 9 2 4 6 8 10 1 3 5 7 9 11 13 2 4 6 8 10 12 14
// ConsoleAppAcmTest11.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
void OddEvenSepar(int *num, int N)
{
for (int i = 0; i < N;i++)
{
int k = 1;
while (k < num[i])
{
if (k % 2 == 1)
{
cout << k << " ";
}
k++;
}
cout << endl;
int kk = 1;
while (kk < num[i])
{
if (kk % 2 == 0)
{
cout << kk << " ";
}
kk++;
}
cout << endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
system("color 0A");
int N = 0;
cout << "请输入测试组数:" << endl;
cin >> N;
int *num = new int[N];
cout << "请输入对应个数的偶数" << endl;
for (int i = 0; i < N;i++)
{
cin>>num[i];
}
cout << endl;
OddEvenSepar(num, N);
delete[] num;
num = NULL;
system("pause");
return 0;
}
1 2 3 4 5
1 5
难度:1,第31题
方法:
排序法,或者直接求取
“五个数求最值”代码实现如下:
// ConsoleAppAcmTest31.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
void getMinMax(int *num,int n)
{
int min = num[0], max = num[0];
for (int j = 0; j < n;j++)
{
if (min>num[j])
{
min = num[j];
}
if (max < num[j])
{
max = num[j];
}
}
cout << "最小值为:" << min << endl;
cout << "最大值为:" << max << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
system("color 0A");
int num[5] = {0};
for (int i = 0; i < 5;i++)
{
cin >> num[i];
}
getMinMax(num,5);
system("pause");
return 0;
}
2 1 6
41
难度1,第34题
方法:
暴力破解,遍历出答案
// ConsoleAppAcmTest34.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
int HanXinCount(int *num);
int _tmain(int argc, _TCHAR* argv[])
{
system("color 0A");
int *num = new int[3];
cout << "请输入3种排列方式的队尾人数:"<> num[i];
}
int persons = HanXinCount(num);
if (persons==-1)
{
cout << "No Answer" << endl;
}
else
{
cout << "人数共为:" << persons << endl;
}
delete[] num;
num = NULL;
system("pause");
return 0;
}
int HanXinCount(int *num)
{
int persons = -1;
for (int i = 10; i <= 100;i++)
{
if ( i%3==num[0] && i%5==num[1] && i%7==num[2])
{
persons = i;
}
}
return persons;
}
5 3
543 542 541 532 531 521 432 431 421 321
难度3,第32题
方法:
DFS法,深度遍历型程序设计
“组合数”代码实现如下:
// ConsoleAppAcmTest32.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
int a[11];
bool visit[11];//存放数据被访问否
void DFSCombiNum1(int n,int cur, int r);
void printNum(int *w, int r);
int _tmain(int argc, _TCHAR* argv[])
{
system("color 0A");
int n = 5;
int r = 3;
cout << "确定范围1到n:请输入n的具体值"<> n;
while (n>10)
{
cout << "重新确定范围1到n:请输入n的具体值" << endl;
cin >> n;
}
cout << "从1到n取r个数:请输入r的具体值" << endl;
cin >> r;
while (r > n)
{
cout << "重新输入r" << endl;
cin >> r;
}
memset(visit, false, sizeof(visit));//初始化
DFSCombiNum1(n,1, r);
system("pause");
return 0;
}
//递归法DFS
void DFSCombiNum1(int n, int cur, int r) //入口、当前层、总层数
{
if (cur > r) //结束条件
return;
for (int i = n; i >= 1; i--)//从n遍历到1,
{
if (!visit[i])//当前这个数没有被访问过,则访问他
{
visit[i] = true;
a[cur] = i;//记录要输出的数字
if (cur == r)//每次当cur增加到r时就输出放在a中的数
{
printNum(a, r);
}
DFSCombiNum1(i - 1, cur + 1, r);
visit[i] = false;
}
}
}
void printNum(int *a, int r)
{
for (int i = 1; i <= r; i++)
{
cout << a[i];
}
cout << endl;
}
#include
#include
using namespace std;
void Multiply(const string &a, const string &b, vector &ansStr);
int main()
{
string bigNum1, bigNum2; // 初始状态用string来存储大数
while (cin >> bigNum1 >> bigNum2)
{
vector ans(bigNum1.size() + bigNum2.size(), 0);//接收答案,这里必须给予ans大小,否则传递参数时out of range
Multiply(bigNum1, bigNum2, ans);
for (unsigned int i = 1; i < ans.size(); i++)
cout << ans[i];
cout << endl;
ans.clear();
}
return 0;
}
void Multiply(const string &a, const string &b, vector &ans)
{
int lena = a.length(),lenb = b.length();
for (int i = 0; i < lena; i++)
{
for (int j = 0; j < lenb; j++)
{//25,a[0]=2,a[1]=5,31,b[0]=3,b[1]=1;推出==》ans[1]=6,ans[2]=17,ans[3]=5,(ans[0]=0)
ans[i + j + 1] += (a[i] - '0')*(b[j] - '0');
}}
for (int i = lena + lenb - 1; i >= 0; i--)// 这里实现进位操作
{
if (ans[i] >= 10)
{
ans[i - 1] += ans[i] / 10;//让高位获得来自低位的进位值,注意ans[i]相对ans[i-1]是低位
ans[i] %= 10;//低位自裁,只保留当前数的个位即可,比如223,只保留3,22给高位
}}}
#include "string"
#include "vector"
#include
using namespace std;
int main()
{
string str;
while (getline(cin,str))
{
//以此为例 "I am Chinese."
int i = 0, j = str.size() - 1;
char temp;
//逆置字符串,"esenihC. ma I"
while (j > i)
{
temp = str[i];
str[i] = str[j];
str[j] = temp;
i++; j--;
}
//部分反转,"Chinese. am I"
int begin = 0, end = 0;
int ii = 0;
while (ii < str.size())
{
if (str[ii] != ' ')//寻找空格前的子串
{
begin = ii;
while (str[ii] != ' '&& ii < str.size())//这里考虑了在计数最后一个字符时的情况
{
ii++;
}
ii--;
end = ii;
}
while (end > begin)
{
temp = str[begin];
str[begin++] = str[end];
str[end--] = temp;
}
ii++;
}
cout << str << endl;
}
return 0;
}
PS:有的东西表面看上去公正、全面,实际可能走向极端的分立思维,许多客观事物不能简单均分,可能其内在具有复杂的联系,一旦坚持平分,结果倒失去了客观、全面的基础。
维基百科告诉我们要这样写:为什么呢?
一般二分法这样写:
所以解决这个问题的方法就是:
mid = ((unsigned int)low + (unsigned int)high)) >> 1 ;
或者
mid = low+(high-low)/2;
构造函数是一个很特殊的成员函数,当一个对象被创建时他将会自动被调用。析构器也是一个很特殊的成员函数,当对象在作用域结束时会被自动的隐式调用。当动态分配内存和销毁时也会调用这两个特殊的函数,即new和delete操作符!
进入正题,显式调用这两个特殊的函数:
当构造器被显式调用时,编译器立刻创建了一个未命名的临时对象,同时它也被立刻销毁,这也是为什么输出中的第二行会是“析构器被执行”特别注意,如果对象时动态分配的内存,千万别显式调用析构器,因为delete会调用析构器。
类的成员函数也能调用析构器和构造器
最后再来分析一段程序:
有时候显示调用析构器是有用的,微软告诉我们:
很少需要显式调用析构函数。 但是,对置于绝对地址的对象进行清理会很有用。 这些对象通常使用采用位置参数的用户定义的 new 运算符进行分配。 delete 运算符不能释放该内存,因为它不是从自由存储区分配的(有关详细信息,请参阅 new 和 delete 运算符)。 但是,对析构函数的调用可以执行相应的清理。 若要显式调用 String 类的对象 s 的析构函数,请使用下列语句之一:
s.String::~String(); // Nonvirtual call ps->String::~String(); // Nonvirtual call s.~String(); // Virtual call ps->~String(); // Virtual call
可以使用对前面显示的析构函数的显式调用的表示法,无论类型是否定义了析构函数。 这允许您进行此类显式调用,而无需了解是否为此类型定义了析构函数。 显式调用析构函数,其中未定义的析构函数无效。
#include "iostream"
#include "windows.h"
#include "fstream"
#include "algorithm"
using namespace wavelet;
using namespace std;
bool AdjustData(
double *pDetCoef,
const int height,
const int width
)
{
if (pDetCoef == NULL)
return false;
double *ptmpdet = new double[height / 2 * width];
for (int i = 0; i < height / 2 * width; i++)
ptmpdet[i] = pDetCoef[i];
int pos1 = 0;
int pos2 = height / 2 * width / 2;
for (int i = 0; i < height / 2; i++)
{
for (int j = 0; j < width; j++)
{
if (j < width / 2)
pDetCoef[pos1++] = ptmpdet[i*width + j];
else
pDetCoef[pos2++] = ptmpdet[i*width + j];
}
}
delete[] ptmpdet;
ptmpdet = NULL;
return true;
}
bool IAdjustData(
double *pDetCoef,
const int height,
const int width
)
{
if (pDetCoef == NULL)
return false;
double *ptmpdet = new double[height / 2 * width];
for (int i = 0; i < height / 2 * width; i++)
ptmpdet[i] = pDetCoef[i];
int pos1 = 0;
int pos2 = height / 2 * width / 2;
for (int i = 0; i < height / 2; i++)
{
for (int j = 0; j < width; j++)
{
if (j < width / 2)
pDetCoef[i*width + j] = ptmpdet[pos1++];
else
pDetCoef[i*width + j] = ptmpdet[pos2++];
}
}
delete[] ptmpdet;
ptmpdet = NULL;
return true;
}
int main()
{
system("color 0A");
double s[30] = {1,2,3,4,5,6, 2,3,4,5,6,7, 3,4,5,6,7,8, 4,5,6,7,8,9, 5,6,7,8,9,10};
int height = 5;
int width = 6;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
cout << s[i*width + j] << " ";
cout << endl;
}
cout << endl; cout << endl;
AdjustData(s,height,width);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
cout << s[i*width + j] << " ";
cout << endl;
}
IAdjustData(s, height, width);
cout << endl; cout << endl;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
cout << s[i*width + j] << " ";
cout << endl;
}
system("pause");
return 0;
}