当前位置:首页 » 编程语言 » 津巴布韦算法题c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

津巴布韦算法题c语言

发布时间: 2022-11-22 04:51:36

① 算法问题。求用c语言写一个字符串输入的计算器。如1+2*3=7。输入的均为整数,不需要有括号什么的

思路:反复扫描,发现了*或者\,则将左边的值和右边的值替换为两者的计算结果,然后替换,最后扫描+或者-,计算结果。

② 这一个比较难得计算机算法题目,希望大神能用C语言给我编一段,谢谢。

/*
*将环拆成0到n的直线,0和n都表示该苦逼学生,以0为球的出发点
*/
#include<stdio.h>
inta[31][31];//a[i][j]表示球经过j步走到节点i的走法数量
main()
{
intm,n;
scanf("%d%d",&n,&m);
for(inti=0;i<=n;++i)
{
if(i==1)a[i][1]=1;
elsea[i][1]=0;
}
for(intj=2;j<=m;++j)
{
for(inti=0;i<=n;++i)
{
if(i<=1)a[i][j]=a[i+1][j-1];//0,1只接受从右边传来的球
elseif(i>=n-1)a[i][j]=a[i-1][j-1];//n-1,n只接受从左边传来的球
elsea[i][j]=a[i-1][j-1]+a[i+1][j-1];//其他情况则把两种可能性相加
}
}
//只考虑初始从左边出发的情况(0为出发点),所以最终结果要乘2
printf("%d ",2*(a[0][m]+a[n][m]));
}

③ 求助一道C语言的题目. (速度).....

/*一副扑克有52张牌,打升级时应将牌分给四个人。请设计一个程序完成自动发牌的工作。

要求:黑桃用S(Spaces)表示;红桃用H(Hearts)表示;方块用D(Diamonds)表示;梅花用C(Clubs)表示。

问题分析与算法设计
按照打升级的规定,每人应当有13张牌。在人工发牌时,先进行洗牌,然后将洗好的牌按一定的顺序发给每一个人。
为了便于计算机模拟,可将人工方式的发牌过程加以修改:先确定好发牌顺序:1、2、3、4;将52张牌顺序编号
:黑桃2对应数字0,红桃2对应数字1,方块2对应数字2,梅花2对应数字3,黑桃3对应数字4,红桃3对应数字5,…
然后从52 张牌中随机的为每个人抽牌(也可以采取其它的编号方式)。
这里可以采用C语言库函数的随机函数,生成0到51之间的共52个随机数,以产生洗牌后发牌的效果。

运行示例:
S K J 8
H A J 5 3
D Q 8
C K J 7 5

S A T 6 4 2
H 4 2
D 7 6 4
C Q T 9

S 9 7 5 3
H K Q T 9
D J 3 2
C 8 2

S Q
H 8 7 6
D A K T 9 5
C A 6 4 3
思考题(必须完成):完成2副牌的自动发牌,每人应当有26张牌,而且需将每家所得的牌进行排序。
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

#define CARD_NUM_OF_A_PACK 52
#define NUM_OF_PLAYERS 4
#define NUM_ONEPACK_OF_PLAYER (CARD_NUM_OF_A_PACK/4)

#define SIZE (sizeof(Card_t)*CARD_NUM_OF_A_PACK)

typedef struct tagCard
{
char value;
char color;
}Card_t;

void CardInit(Card_t **pInCard)
{
Card_t *pCard = *pInCard;
Card_t *pTempCard = NULL;
int i;
int j;

memset(pCard,0,SIZE);
pTempCard = pCard;

for(j = 1;j <= 4;j++)
{
for (i = 1;i <= CARD_NUM_OF_A_PACK/4;i++)
{
if (1 == j)
{
pTempCard->color = 'S';
}
else if (2 == j)
{
pTempCard->color = 'H';
}
else if (3 == j)
{
pTempCard->color = 'D';
}
else if (4 == j)
{
pTempCard->color = 'C';
}

if (i <= 10)
{
pTempCard->value = i;
}
else if(i == 11)
{
pTempCard->value = 'J';
}
else if(i == 12)
{
pTempCard->value = 'Q';
}
else if(i == 13)
{
pTempCard->value = 'K';
}
pTempCard++;
}
}

return;

}

void CardFree(Card_t **pCard)
{
if (*pCard)
{
free(*pCard);
*pCard = NULL;
}
}

void Deal(Card_t **pInCard)
{
Card_t players[NUM_OF_PLAYERS][CARD_NUM_OF_A_PACK/NUM_OF_PLAYERS];
int i;
int j;
int k;
int temp;
long cardUsedNum = 0;
int packOfCard = 0;
int playerNo = 0;
int playerCardNo = 0;
Card_t tempCard = {0};
int CartCount = 0;
Card_t *pCard = *pInCard;
int run = 1;
int cCount[NUM_OF_PLAYERS];
int hCount[NUM_OF_PLAYERS];
int dCount[NUM_OF_PLAYERS];
int sCount[NUM_OF_PLAYERS];

char c[NUM_OF_PLAYERS][CARD_NUM_OF_A_PACK/NUM_OF_PLAYERS];
char h[NUM_OF_PLAYERS][CARD_NUM_OF_A_PACK/NUM_OF_PLAYERS];
char d[NUM_OF_PLAYERS][CARD_NUM_OF_A_PACK/NUM_OF_PLAYERS];
char s[NUM_OF_PLAYERS][CARD_NUM_OF_A_PACK/NUM_OF_PLAYERS];

CartCount = CARD_NUM_OF_A_PACK;
memset(players,0,sizeof(players));
memset(c,0,sizeof(c));
memset(h,0,sizeof(h));
memset(d,0,sizeof(d));
memset(s,0,sizeof(s));

if (NULL == pCard)
{
return;
}

srand((int)time(0));

while(run)
{
temp = (int)(CartCount*rand()/(RAND_MAX+1.0));

players[playerNo][playerCardNo].color = pCard[temp].color;
players[playerNo][playerCardNo].value = pCard[temp].value;

pCard[temp].color = pCard[CartCount-1].color;
pCard[temp].value = pCard[CartCount-1].value;

pCard[CartCount-1].color = players[playerNo][playerCardNo].color;
pCard[CartCount-1].value = players[playerNo][playerCardNo].value;

CartCount-=1;
if (CartCount < 0)
{
packOfCard++;
if(packOfCard >= 1)
{
run = 0;
}
CartCount = CARD_NUM_OF_A_PACK;
}

playerCardNo+=1;
if (playerCardNo >= NUM_ONEPACK_OF_PLAYER)
{
playerNo+=1;
playerCardNo = 0;
}
}

for(i = 0;i < NUM_OF_PLAYERS;i++)
{
sCount[i] = 0;
hCount[i] = 0;
dCount[i] = 0;
cCount[i] = 0;
for (j = 0;j < NUM_ONEPACK_OF_PLAYER;j++)
{
if ('S' == players[i][j].color)
{
s[i][sCount[i]] = players[i][j].value;
sCount[i]++;
}
else if ('H' == players[i][j].color)
{
h[i][hCount[i]] = players[i][j].value;
hCount[i]++;
}
else if ('D' == players[i][j].color)
{
d[i][dCount[i]] = players[i][j].value;
dCount[i]++;
}
else if ('C' == players[i][j].color)
{
c[i][cCount[i]] = players[i][j].value;
cCount[i]++;
}
}
}

for (i = 0;i < NUM_OF_PLAYERS;i++)
{
for (j = 0;j < cCount[i] ;j++)
{
for(k = 1;k < cCount[i]-j;k++)
{
if(c[i][j] > c[i][k])
{
temp = c[i][j];
c[i][j] = c[i][k];
c[i][k] = temp;
}
}
}
}

for (i = 0;i < NUM_OF_PLAYERS;i++)
{
for (j = 0;j < hCount[i] ;j++)
{
for(k = 1;k < hCount[i] -j;k++)
{
if(h[i][j] > h[i][k])
{
temp = h[i][j];
h[i][j] = h[i][k];
h[i][k] = temp;
}
}
}
}

for (i = 0;i < NUM_OF_PLAYERS;i++)
{
for (j = 0;j < dCount[i] ;j++)
{
for(k = 1;k < dCount[i] -j;k++)
{
if(d[i][j] > d[i][k])
{
temp = d[i][j];
d[i][j] = d[i][k];
d[i][k] = temp;
}
}
}
}

for (i = 0;i < NUM_OF_PLAYERS;i++)
{
for (j = 0;j < sCount[i] ;j++)
{
for(k = 1;k < sCount[i] - j;k++)
{
if(h[i][j] > h[i][k])
{
temp = s[i][j];
s[i][j] = s[i][k];
s[i][k] = temp;
}
}
}
}

for (i = 0;i < NUM_OF_PLAYERS;i++)
{
printf("Player:%d\n",i+1);
printf("S:");
for (j = 0;j < sCount[i];j++)
{
if (s[i][j] <= 10)
printf("%d ",s[i][j]);
else
printf("%c ",s[i][j]);
}
printf("\nH:");
for (j = 0;j < hCount[i];j++)
{
if (h[i][j] <= 10)
printf("%d ",h[i][j]);
else
printf("%c ",h[i][j]);
}
printf("\nD:");
for (j = 0;j < dCount[i];j++)
{
if (d[i][j] <= 10)
printf("%d ",d[i][j]);
else
printf("%c ",d[i][j]);
}
printf("\nC:");
for (j = 0;j < cCount[i];j++)
{
if (c[i][j] <= 10)
printf("%d ",c[i][j]);
else
printf("%c ",c[i][j]);
}

printf("\n");
}
}

int main()
{
Card_t *pCard = NULL;

pCard = (Card_t *)malloc(SIZE);
if (NULL == pCard)
{
printf("error");
return;
}

CardInit(&pCard);

Deal(&pCard);

free(pCard);

}

④ c语言算法。分治法,金块问题。

int &fmin表示形参的【引用】声明,&是【引用操作符】,不是指针的地址操作符,都可以表示指向, int &fmin“参数类型 &形参”实际上相当于“int &fmin=min”,“参数类型 &形参=实参”
被引用的形参fmin与其对应的实参min代表同一变量,可以互换,代替实参进行同样的操作,可理解为实参的别名
”同样是int类型的虚参,为啥跟i,j不是一个待遇“

这句话的理解不对
在maxmin(int i,int j,int &fmax,int &fmin){......}中,i、j是maxmin()函数的形参(虚参)

在int main (){ int n,i,j,max,min;.......}中,i、j是主函数main()的参数,当它们用在maxmin()函数的函数头,作为maxmin()函数的参数,理解为maxmin()函数的实参(是maxmin()函数的实参),是函数形参的具体赋值,
所以通常只有在主函数main()中才可以看到有实参的函数头(实参值调用形式)或无实参的空函数头
只有在主函数中看到其它所有函数的实参

⑤ 这道C语言题目怎么做~

#include<stdio.h>

void main(void)
{ char input,output;
printf("please input a charactor:\n");
scanf("%c",&input);
if(input>='A'&&input<='Z')
{
output=input+6;
if(output>='Z')
{ output=output-26;
}
}
else if(input>='a'&&input<='z')
{
output=input+6;
if(output>='z')
{ output=output-26;
}
}
else output=input;
printf("the result is %c\n",output);
}

⑥ 求大神解答下面这道程序问题。。万分感谢,。。

//求将e重排后小于e且是m倍数的个数

#include<bits/stdc++.h>//C++万能头文件
usingnamespacestd;
usingll=longlong;
constintmod=1e9+7;

intcount(stringe,intm){//方法一,暴力搜索
llcnt=0;
strings=e;//遍历每个小于e的排列s
sort(s.begin(),s.end());//升序后为最小的排列
while(s!=e){//保证s小于e
llnum=stoll(s);//转为长整数
if(num%m==0)//判断其是否为m的倍数
++cnt;
next_permutation(s.begin(),s.end());//库函数取下个排列
}
returncnt%mod;
}

intdp_count(stringe,intm){//方法二,状态压缩动态规划
intn=e.length();
inta[n];//保存e各数位值
for(inti=0;i<n;++i)
a[i]=e[i]-'0';
intsize=1<<n;//总状态数,每个状态二进制为1的位对应该数是否被选择
lldp[size][m][2];//i状态组合中模m余j且小于a的排列个数
//状态i的二进制表示中1的个数d表示下一数位最终对应a[d]
//第3维为0表示当前位为止有数位小于a中对应位数值,下一数位可任取
//为1表示当前位为止所有数位都与a中对应位数值相等,下一数位不能大于a[d]
memset(dp,0,sizeof(dp));
dp[0][0][1]=1;//初始条件,最高位值不能大于a[0]
for(inti=0;i<size;++i){//遍历各组合状态
for(intj=0;j<m;++j){//遍历各余数
for(intp=0;p<2;++p){//当前为止是否有数位小于对应a[d]
if(dp[i][j][p]==0)
continue;//计算过的状态上继续添加数位
intvis[10]={0};//防止重复计算
for(intk=0;k<n;++k){//添加数a[k]为下一数位
if((i&(1<<k))||vis[a[k]])
continue;//跳过已选择以及重复的数
intd=__builtin_popcount(i);//a[k]最终对应为a[d]
//注意a[k]每次添加到末尾,所以状态转移中余数变为(j*10+a[k])%m
if(p==0){//下一数位可取a中的任意值
dp[i|(1<<k)][(j*10+a[k])%m][0]+=dp[i][j][0];
vis[a[k]]=1;
}
elseif(a[k]<=a[d]){//下一数位取值不能超过a[d]
if(a[k]==a[d])
dp[i|(1<<k)][(j*10+a[k])%m][1]+=dp[i][j][1];
else
dp[i|(1<<k)][(j*10+a[k])%m][0]+=dp[i][j][1];
vis[a[k]]=1;
}
}
}
}
}
returndp[size-1][0][0]%mod;
}

intmain(){
intC;
cin>>C;
while(C--){
stringe;
intm;
cin>>e>>m;
//cout<<count(e,m)<<" ";//暴力搜索会超时
cout<<dp_count(e,m)<<" ";//建议使用动态规划
}
return0;
}

g++编译通过,程序运行结果与示例相符

望采纳,谢谢~

⑦ C语言 递归算法 整数划分问题

#include<stdio.h>
intstack[100];
inttop;
inttotal,n;
voiddfs(intindex)
{
inti;
if(total==n)
{
printf("%d=",n);
for(i=top-1;i>0;i--)
printf("%d+",stack[i]);
printf("%d ",stack[0]);
}
if(total>n)
return;
for(i=n-1;i>=index;i--)
{
total+=i;
stack[top++]=i;
dfs(i);
total-=i;
stack[--top];
}
}
voidmain()
{
while(scanf("%d",&n)!=EOF)
{
top=0;
total=0;
dfs(1);
}
}

⑧ 编写C语言算法,试编写一个求解Josephus问题的函数,用整数序列1, 2, 3, ……

#include<stdio.h>
int Josephus(int n, int k)
{
int i, j, s, num, *a;
a = new int[n+1];
j = s = 0;
for (i=0; i<=n; i++)
a[i]=1;
for(i=1; i<=n; i++)
{
if (a[i] == 1)
{
j = j+a[i];
if (j == k)
{
j=0;
a[i]=0;
s++;
}

⑨ 一道c语言题目 求大神指点下算法

根据题意,随机生成红绿蓝球任意个数,并任意顺序排列。这里采用随机数实现。

统计按红绿蓝顺序排列最少交换次数,我的思路是:

第一步:循环将最后一个红色球与最靠前的其它两色球(并且满足位置在红球之前)交换。

第二步:循环将最后一个绿球与最靠前的蓝球(必须在绿球之前)交换。

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define MR 5//每种颜色的球随机生成的最大数量

void showList(int qs[],int len);

int jh(int qs[],int len);//返回交换次数

int main()

{

int i,len,qs[MR*3],n;

int r,g,b;//红绿蓝数量

srand(time(NULL));

r=rand()%MR+1;//1~MR的随机数

g=rand()%MR+1;

b=rand()%MR+1;

len=r+g+b;

printf("随机生成红球%d个,绿球%d个,篮球%d个 ",r,g,b);

printf("开始随机排列。。。。。。 ");

for(i=0;i<len;i++)

{

n=rand()%3+1;//位置采取抽签,生成1~3的随机数,1表示红,2表示绿,3表示蓝

switch(n)

{

case 1:

if(r>0) qs[i]=n,r--;

else i--;

break;

case 2:

if(g>0) qs[i]=n,g--;

else i--;

break;

case 3:

if(b>0) qs[i]=n,b--;

else i--;

break;

}

}

printf("随机排列后的队列情况为: ");

showList(qs,len);

printf(" ");

jh(qs,len);

return 0;

}

int jh(int qs[],int len)//返回交换次数

{

int cnt=0;

int jhbl(int qs[],int len,int lq,int bq);

//最后的红和最前的绿或蓝(且绿球或篮球位置在红球之前)交换

cnt+=jhbl(qs,len,1,0);

//最前的篮球和最后的绿球交换

cnt+=jhbl(qs,len,2,3);

printf("总交换次数至少%d: ",cnt);

return cnt;

}

int jhbl(int qs[],int len,int lq,int bq)//lq:交换中最靠后的球色编号(1~3),bq:交换中最靠前的球色编号(1~3),bq=0:lq与其他两种颜色任意交换

{

int i,j,qSave,cnt=0;

for(i=len-1;i>=0;i--)

{

if(qs[i]==lq)

{

for(j=0;j<len;j++)

if(((bq==0 && qs[j]!=lq)||(bq!=0 && qs[j]==bq)) && j<i)

{

printf("第%d个%s%s%s与第%d个%s%s%s交换,交换后(交换%d次): ",i+1,lq==1?"红球":"",lq==2?"绿球":"",lq==3?"蓝球":"",j+1,qs[j]==1?"红球":"",qs[j]==2?"绿球":"",qs[j]==3?"蓝球":"",cnt+1);

qSave=qs[j],qs[j]=qs[i];qs[i]=qSave,cnt++;

showList(qs,len);

printf(" ");

i=len-1;

break;

}

}

}

return cnt;

}

void showList(int qs[],int len)

{

int i;

for(i=0;i<len;i++)

printf("%s%s%s ",qs[i]==1?"红":"",qs[i]==2?"绿":"",qs[i]==3?"蓝":"");

printf(" ");

}