当前位置:首页 » 编程语言 » c语言盒子和糖果放置问题
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言盒子和糖果放置问题

发布时间: 2022-05-01 07:27:10

A. 求救,有一个c语言程序设计编程题目,请高手帮忙,万分感谢

#include<stdio.h>
#include<time.h>
intmain()
{
ints,r;
intm[100]={0};
inti,j;
for(i=0;i<20;i++)
{
j=rand()%100;
if(m[j]==0)
m[j]=10;
else
i--;
}
for(i=0;i<10;i++)
{
j=rand()%100;
if(m[j]==0)
m[j]=-5;
else
i--;
}
for(i=0;i<70;i++)
{
j=rand()%100;
if(m[j]==0)
m[j]=-1;
else
i--;
}
s=0;
srand((int)time(0));
for(i=0;i<40;i++)
{
printf(" 第%d次,输入R:",i+1);
scanf("%d",&r);
j=rand()%100;
s+=m[j]*r;
printf("抽到%dr,%s%d,当前本金:%d ",m[j],m[j]>0?"获得":"损失",m[j]*r,s);
}
printf("最终本金:%d",s);
}

前面三个循环主要是随机初始化倍率数组。

B. C语言编程 吃糖果的问题 难!!!!

只有在T组糖果中,当任意的某一种糖果的数量 - 剩余T-1种糖果的数量之和 ≥ 2的情况下,才不可能吃完。其他任何情况下都可以吃完。

证明: 设糖果有T种, 每一种有X1,X2,X3,......XT 个。
步骤一: 取X1,X2,X3........XT 中最小值Xmin。(即标准地每种吃一个,直到把最少的那一组吃完)
那么接下来剩余的糖果种类为T - 1。每一种有X1-Xmin1,X2-Xmin1,X3-Xmin1.......XT-Xmin1 个
步骤二:在剩余的T-1种糖果中,找出数量最少的。(即X1-Xmin,X2-Xmin.......XT-Xmin中最少的)
那么剩余的糖果种类为T-2,每一种有X1-Xmin1-Xmin2,X2-Xmin1-Xmin2.......XT-Xmin1-Xmin2个
重复以上步骤直到最后只剩一种糖果,这个糖果的数量为,Xmax - Xmin1- Xmin2 - Xmin3 ....- Xmin(T-1)
当这个糖果的数量为0的情况下,就可以吃完。不为0的情况下就不可以吃完。
考虑最差情况,即每一次只吃最多的一种糖果和最少的一种糖果。(每次吃2种,其他糖果不吃)
那么最后剩余糖果的数量为 Xmax - X1-X2 -X3 ....-XT
当这个值为1时 则可以吃完。大于1时 则吃不完。

接下来编程就非常容易了。
遍历一遍T组糖果中每种糖果的数量,然后算一下就行了。

C. 一道C语言问题

我打了个暴力程序(就过了样例,也不知道有没有错),因为程序有点太暴力了,所以算到n=15就开始慢下来。可以看到答案是有规律的。首先从n=1到15答案分别是1,2,2,3,3,3,3,4,4,4,4,4,4,4,4(也是因为答案太有规律了,就懒得笔算暴力程序到底对不对了)。可以看出来,答案中1、2、3、4的个数分别是1,2,4,8。看到这里大概规律就可以很明显的知道了吧。
假设暴力程序没有错,答案也是按照上述规律排列的话……那么假设答案是ans,那么2^0+2^1+2^2+……2^(ans-2)<=n<=2^0+2^1+2^2+……2^(ans-1)
这里其实主要就是计算2的等比数列求和。这个公式很好推的,Sn={a1*(1-q^n)}/1-q。
也就是 S(ans-2)<=n<=S(ans-1)
题目里没讲到T的数据范围就有点头疼。

如果T不是很大的话,找ans的话可以考虑二分答案求,整个程序下来复杂度就大约为Tlog2(n)
上面的内容一口气打下来的,不知道有没有错……
后面是我那个暴力的程序orz
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstdio>
using namespace std;
int box[10000],MIN;
int dfs(int a,int num)
{
bool choose[51];int sum;int max_now;
for(int i=1;i<=50;i++)choose[i]=0;
max_now=0;
for(int i=1;i<=a;i++)max_now=max(max_now,box[i]);
// cout<<a<<""<<num<<" "<<max_now<<endl;
for(int i=1;i<=max_now;i++)
{
sum=0;
for(int j=1;j<=a;j++)
{
if(box[j]>=i)box[j]-=i,choose[j]=1;
sum+=box[j];
}
if(sum)dfs(a,num+1);
else {MIN=min(MIN,num);}
// cout<<a<<""<<num<<" "<<max_now<<" "<<MIN<<" "<<sum<<endl;
for(int j=1;j<=a;j++)
if(choose[j])box[j]+=i,choose[j]=0;
}
}
int main()
{
int a;
for(int i=1;i<=50;i++)
{
MIN=10000000;
for(int j=1;j<=i;j++)box[j]=j;
dfs(i,1);
cout<<MIN<<" ";
}

}

D. C语言编程怎么解决分糖问题

分糖果问题

幼儿园有n(<20)个孩子围成一圈分糖果,老师先随机地发给每个孩子若干颗糖果,然后按以下规则调整:每个孩子同时将自己手中的糖果分一半给坐在他右边的小朋友;如共有8个孩子,则第1个将原来的一半分给第2个,第2个将原有的一半分给第3个……第8个将原来的一半分给第1个,这样的平分动作同时进行;若平分前,某个孩子手中的糖果是奇数颗,则必须从老师那里要一颗,使他的糖果变成偶数。小孩人数和每个
小孩的初始数由键盘输入。经过多少次调整,使每个孩子手中的糖果一样多,调整结束时每个孩子有糖果多少颗,在调整过程中老师又新增发了多少颗糖果。

#include<stdio.h>
#defineN20

intn;
intequal(int[]);
intmain()
{
intnum=0,count=0,i,t1,t2;
intchild[N];
printf("请输入小孩数:");
scanf("%d",&n);
printf("请输入每个小孩手中的原始糖数:");
for(i=0;i<n;i++)
scanf("%d",&child[i]);
while(!equal(child))
{
for(i=0;i<n;i++)
{
if(child[i]%2!=0)
{
child[i]+=1;
num+=1;
}
}
t1=child[0];
for(i=0;i<n;i++)
{
t2=child[(i+1)%n];
child[(i+1)%n]/=2;
child[(i+1)%n]+=t1/2;
t1=t2;
}
count+=1;
for(i=0;i<n;i++)
printf("%d",child[i]);
printf(" ");
}
printf("经过%d次交换后糖数相等,糖数是%d颗 调整过程中新发%d颗糖 ",count,child[1],num);
return0;
}
intequal(intchild[])
{
inti;
for(i=1;i<n;i++)
if(child[i]!=child[i-1])
return0;
return1;
}

运行结果

E. c语言在线答疑,求高人指导~~~谢谢了~~~

第一个:你定义的是char,其表示范围是-128到127;你的0345是八进制数,换算成十进制是229,原码是11100101,反码是10011010,补码是10011011,其表示的就是-27的二进制数在计算机里面的存储

第二个:((ch=getchar())=='g') ,这个条件判断中的ch=getchar()这个表达式的值在你输入a的时候,不等于'g',循环终止。所以是0次。

第三个:putchar(n%10+'0');n=321,n%10+'0'=’1‘;if((i=n/10)!=0) printd(i)中,i=n/10 的值是32,后面递归调用函数本身。3次函数调用输出的字符分别是'3','2','1'。

第四个:抱歉,你给的答案是错误的。输出结果应该是abcabcabcbcabcc;原因如下:二维数组里面存的是abc,abc,abc这9个字符。循环3次输出分别从第一个,第五个,第九个字符输出。

第五个:这个是函数的递归调用。第一次输入a,并递归到下一层输入b,再递归到下一层输入#
条件符合退出递归,输出当前层的c,即#,退回上一层输出当前c,即b,再退回上一层输出当前c,即a。这就是ab##ba。

第六个:这个是由于define中的M+M没有加()。表达式经编译器编译后就是M+M*M+M*5,就是55。如果在define中加上括号,即(M+M),表达式就是(M+M)*(M+M)*5了。

第七个:你在swap中交换的是指针的值,不是指针指向的空间的值。所以没有交换成功。就是原来的12和15。

完了。。我真是闲的呵呵。。。。大半夜睡不着觉。。。。

F. c语言编程 十层的架子,每层放的糖果数都是前一层的2倍多1块,第十层放4607块糖果,第一层放了多少块糖果

第一层放了7块糖果。

#include<stdio.h>

intresult(intn)
{
if(n==1)
return4607;
else
returnresult(n-1)/2-1;
}

intmain(void)
{
printf("第一层放了%d块糖。 ",result(10));
return0;
}

G. 这一道c语言题目谁能帮我解答一下十分感谢...

试了几个都对,应该可以

#include<stdio.h>

intmain()

{

intn,k;

longlongsum=0;

scanf("%d%d",&n,&k);

for(inti=0;i<n;i++)

{

sum=(1+n-i)*(n-i)/2;

if((sum-i)==k)

{

printf("%d",i);

break;

}

}

return0;

}

H. c语言编程

这个题目太简单了,不过我想问问,那个盒子是怎么构成的,以及老鼠是怎么咬盒子的?

I. c语言编程问题,如图所示

主函数里第二句中的char修改为*pArray即可。
作详细说明前,请允许我多说一些对于指针的理解,因为不确定po主是否了解指针,所以我把我的理解给你说一下,希望能起到一些帮助。
指针和一般变量都可以当做一个盒子,每个盒子都有自己该处的位置(地址),不同之处在于一般变量的盒子里存放着具体的数值或字符(其实字符也相当于数值),而指针的盒子里存放着别的盒子的位置(地址)。
说明如下(以下的pArray统一用p简称):
*p[]是一个存放指针的数组,该数组每个元素都是一个指针,也就是说每个元素存放的都是一个地址,而非具体数值。
所以我们可以知道,p是代表这个数组本身的首地址,也就是这些连续着的指针的首地址;而*p是代表数组内指针指向的首地址,也就是这批“盒子”里放的东西(那些字符串的地址);*(*p)是代表那些字符串。
显而易见,若我们想知道这批“盒子”的数量,那就是用总盒子的长度,除以每个盒子的长度,就可以得到结果,即sizeof(p)/sizeof(*p)。(如果没记错的话,同一个数组内每行所分配的内存长度都是一致的)
望采纳,谢谢。

J. c语言 包装问题

这个用不着递归,且用递归会有非常“丑陋”的感觉,就用普通的凑法即可。
程序:
#include "stdio.h"
#include "stdlib.h"

void main()
{
int i,j,k;
for(i=1;i<=600/8;i++)
for(j=1;j<(600-i*8)/5;j++)
{
k =(600-i*8-j*5)/2;
if(k*2+i*8+j*5==600)
printf("BigBox %d MedBox %d SmallBox %d\n",i,j,k);
}
system("pause");
}

以上编译运行通过。