① 算法问题。求用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(" ");
}