备注:转载于 http://blog.csdn.net/ychtt/article/details/6774184
7.约瑟夫问题
问题描述:
输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列
该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数
值出列的顺序
比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)
第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数
第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数
第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数
最后一轮计数出列数字为4,计数过程完成。
输出数值出列顺序为:2,3,1,4。
要求实现函数:
void array_iterate(int len, int input_array[], int m, int output_array[])
【输入】 int len:输入数列的长度;
int intput_array[]:输入的初始数列
int m:初始计数值
【输出】 int output_array[]:输出的数值出列顺序
【返回】 无
示例
输入:int input_array[] = {3,1,2,4},int len = 4, m=7
输出:output_array[] = {2,3,1,4}
- #include "iostream"
- using namespace std;
- struct Node
- {
- int data;
- Node *next;
- };
- void array_iterate(int len, int input_array[], int m, int output_array[])
- {
- if (NULL==input_array||0==m||0==len)
- return 0;
- Node *node=new Node;
- Node *head=new Node;
- head->data=input_array[0];
- Node *p=head;
- int k=0;
- for (int i=1;i<len;i++)
- {
- node=new Node;
- node->data=input_array[i];
- p->next=node;
- p=node;
- }
- p->next=head;
- p=head;
- Node *q=new Node;
- int count;
- while (p->next!=p)
- {
- count=1;
- while (count<m)
- {
- q=p;
- p=p->next;
- count++;
- }
- m=p->data;
- output_array[k++]=m;
- q->next=p->next;
- p=q->next;
- }
- output_array[k]=p->data;
- }
- void main()
- {
- int a[]={3,1,2,4};
- int b[4];
- memset(b,0,4*sizeof(int));
- array_iterate(4, a, 7,b);
- printf("%d,%d,%d,%d",b[0],b[1],b[2],b[3]);
- }
8. 简单四则运算
问题描述:
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注: 1、表达式只含 +, -, *, / 四则运算符,不含括号
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
要求实现函数:
int calculate(int len,char *expStr)
【输入】 int len: 字符串长度;
char *expStr: 表达式字符串;
【输出】 无
【返回】 计算结果
示例
1) 输入:char *expStr = “1+4*5-8/3”
函数返回:19
2) 输入:char *expStr = “8/3*3”
函数返回:6
- #include <stdio.h>
- #include <string.h>
- #include "string"
- #include "assert.h"
- struct stack{ //存放后续排列的表达式,模拟栈
- char str[80];
- int top;
- };
- struct sstack{ //存放计算表达式的值,模拟栈
- int str[80];
- int top;
- };
- int calculate(int len,char *expStr)
- {
- char *postexp=new char[len+1];
- stack opstack;
- sstack calstack;
- calstack.top=-1;
- opstack.top=-1;
- int i=0;
- int k=0;
- while(expStr[i]!='\0')
- {
- if (expStr[i]>='0'&&expStr[i]<='9')
- {
- postexp[k++]=expStr[i];
- }
- else if (expStr[i]=='+'||expStr[i]=='-')
- {
- while (opstack.top>=0)
- {
- postexp[k++]=opstack.str[opstack.top--];
- }
- opstack.top++;
- opstack.str[opstack.top]=expStr[i];
- }
- else if (expStr[i]=='*'||expStr[i]=='/')
- {
- while (opstack.top>=0&&(opstack.str[opstack.top]=='*'||opstack.str[opstack.top]=='/'))
- {
- postexp[k++]=opstack.str[opstack.top--];
- }
- opstack.top++;
- opstack.str[opstack.top]=expStr[i];
- }
- i++;
- }
- while (opstack.top>=0)
- {
- postexp[k++]=opstack.str[opstack.top--];
- }
- int temp1=0;
- int temp2=0;
- for (i=0;i<len;i++)
- {
- if (postexp[i]>='0'&&postexp[i]<='9')
- {
- calstack.top++;
- calstack.str[calstack.top]=postexp[i]-'0';
- }
- else if (postexp[i]=='+')
- {
- temp1=calstack.str[calstack.top--];
- temp2=calstack.str[calstack.top];
- calstack.str[calstack.top]=temp2+temp1;
- }
- else if (postexp[i]=='-')
- {
- temp1=calstack.str[calstack.top--];
- temp2=calstack.str[calstack.top];
- calstack.str[calstack.top]=temp2-temp1;
- }
- else if (postexp[i]=='*')
- {
- temp1=calstack.str[calstack.top--];
- temp2=calstack.str[calstack.top];
- calstack.str[calstack.top]=temp2*temp1;
- }
- else if (postexp[i]=='/')
- {
- temp1=calstack.str[calstack.top--];
- temp2=calstack.str[calstack.top];
- calstack.str[calstack.top]=temp2/temp1;
- }
- }
- printf("%d",calstack.str[calstack.top]);
- return calstack.str[calstack.top];
- }
- int main()
- {
- char *expStr = "1+4*5-8/3";
- int len=strlen(expStr);
- calculate(len,expStr);
- }
9.
一副牌中发五张扑克牌给你:让你判断数字的组成:
有以下几种情况:
1:四条:即四张一样数值的牌(牌均不论花色)
2:三条带 一对
3:三条带两张不相同数值的牌
4:两对
5:顺子 包括 10,J,Q,K,A
6:什么都不是
7:只有一对
- void sort(int data[],int n)
- {
- int temp=0;
- for(int i=0;i<n;i++ )
- {
- for (int j=i+1;j<n;j++)
- {
- if (data[i]<data[j])
- {
- temp=data[i];
- data[i]=data[j];
- data[j]=temp;
- }
- }
- }
- }
- void test(int a[],int len)
- {
- int *b=new int[len];
- int count=0;
- bool temp=false;
- for (int i=0;i<len;i++)
- {
- b[i]=a[i];
- }
- sort(b,5);
- for (i=0;i<len-1;i++)
- {
- if (b[i]==b[i+1])
- count++;
- }
- switch (count)
- {
- case 0:
- if (b[0]-b[4]==4||(b[0]-b[3]==3&&b[4]==1))
- {
- printf("顺子");
- }
- else
- printf("什么都不是");
- break;
- case 1:
- printf("只有一对");
- break;
- case 2:
- for (i=0;i<3;i++)
- {
- if (b[i]==b[i+2])
- {
- printf("三条带两张不相同数值的牌");
- temp=true;
- break;
- }
- }
- if (!temp)
- {
- printf("两对");
- }
- break;
- case 3:
- if (b[1]==b[3])
- printf("四条:即四张一样数值的牌");
- else
- printf("三条带 一对");
- break;
- }
- }
- int main()
- {
- int a[5]={1,10,11,12,13};
- test(a,5);
- }