求助C语言“老师分糖果问题”

www_April 2018-03-12 04:36:23
问题描述:
幼儿园老师将糖果分成若干等份,让学生按任意次序领取,第1个领取的,得到1份加上剩余糖果的1/10;第2个领取的,得到2份加上剩余糖果的1/10;第3个领取的,得到3份加上剩余糖果的1/10,........依次类推。问共有多少个学生?老师将糖果分成了多少等份?

#include<stdio.h>
int candy(int n,int m)
{
int i,sum=0,flag=0;
int y[100];//定义第i个小朋友未拿走糖果前的剩余份数
int x[100];//定义第i个小朋友拿走的份数
//计算第i个小朋友获得的糖果数以及人数,份数
for(i=1;i<=m;i++)
{//计算第i个小朋友未拿走糖果前的剩余份数
if(i==1)
y[i]=n;//第一个拿走之前的份数为n
else
y[i]=(y[i-1]-i+1)*9/10;
}
for(i=1;i<=m;i++)
{
//计算第i个小朋友拿走糖果的份数
if(i==1)
x[i]=1+(n-1)/10;
else
x[i]=4+(y[i]-i)/10;
}
for(i=1;i<=m;i++)
{
sum+=x[i];
}//计算总拿走的糖果数
if(sum==n)
flag=1;
else
flag=0;
return flag;
}
void main()
{
int n,m,i,flag;
for(n=11;;n++)
{
for(m=1;;m++)
{
flag=candy(n,m);
if(flag)
break;
}
if(flag)
break;
}
printf("一共有%d个小朋友,老师将糖果分成了%d等份",m,n);
}

运行时间很长,没有显示结果,求助各位我写的程序有什么问题吗?
...全文
1625 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dennis_t 2018-06-05
  • 打赏
  • 举报
回复
你的代码看起来好麻烦啊!
我自己整理了下思路,后面附上用C和C++两种编写的代码,你可以参考一下。
解题思路:
第一步: 先用数学思维考虑本题,设总共有n份糖果,分别设第一个学生得到的份数为sum1,第二个学生得到的份数为sum2。

第二步: 第一个学生得到的份数为:sum1=1 + (n-1)*1/10; 化简后为 sum1=(n+9)/10; 此时,剩下的份数为:

n-(n+9)/10= (9n-9)/10.

第三步:第二个学生得到的份数为:sum2=2+ ((9n-9)/10-2)*1/10,化简后为sum2=(9n+171)/100。

第四步:只有当sum1=sum2的时候,满足题目条件,穷举出结果。
C代码如下:
#include <stdio.h> //引用头文件
int main( )
{
int n; //定义整型变量n
float sum1,sum2; //定义两个学生得到的份数为单精度浮点型

for(n=11; ; n++) //糖果份的开始至少为11,依次增加
{
sum1=(n+9)/10.0; //第一个学生得到的糖果份数
sum2=(9*n+171)/100.0; //第两个学生得到的糖果份数

if(sum1 != (int)sum1) continue; //得到的糖果份数必须为整数
if(sum2 != (int)sum2) continue;
if(sum1 == sum2) break; //只有当sum1与sum2相等的时候,才能穷举出符合条件的结果
}
printf("一共有%d个学生\n将糖果分成了%d份\n",(int)(n/sum1),n); //(n/sum1)即为学生个数

}
运行结果如下
下面这个是用C++编写的代码(思路类似):
#include<iostream>
#include <string>
using namespace std;

int main(void){
float n1,n2;
int n;

for(n=11;;n++){
n1 = (n+9)/10.0;
n2 = (9*n+171)/100.0;
if(n1 !=(int)n1) continue;
if(n2!=(int)n2)continue;
if(n1==n2) break;
}
cout<<n/n1<<'\t'<<n<<endl;
return(0);
}
附上运行结果如图
FoolCarpe 2018-03-13
  • 打赏
  • 举报
回复
现象:candy函数一直返回0 m=100时 越界访问数组 程序直接崩溃 原因:逻辑问题
考拉一枚 2018-03-12
  • 打赏
  • 举报
回复
 for(i=1;i<=m;i++)
    {
        //计算第i个小朋友拿走糖果的份数
        if(i==1)
            x[i]=1+(n-1)/10;
        else
            x[i]=4+(y[i]-i)/10;
    }
第一个问题 x[i]=4+(y[i]-i)/10; 按你的逻辑 x[i]=i+(y[i]-i)/10; 第二个问题:计算过程中是会出现浮点数的,你都用int数组装了,意味着你可能得不到一个合适的解 另外 数组不从0下标开始 好别扭。。。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧