當前位置:首頁 » 編程語言 » 辛巴威演算法題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(" ");

}