2个问题 找错

w74839520 2010-03-30 01:56:33
皮球从 height(米)高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第 n 次落地时,在空中一共经过多少距离?第 n 次反弹的高度是多少?(输出保留1位小数)
#include<stdio.h>
main()
{
double i,height,sum=0;
int n;
printf("please input height:");
scanf("%lf",&height);
printf("please input n:");
scanf("%lf",&n);
for(i=1;i<=n;i++)
{
sum=sum+height;
height=height/2.0;
}
printf("distance is %.1f\n",sum);
printf("height is %.1f\n",height);
}

哪里有问题呢?




改正下面程序中的错误。该程序的功能是输出200以内的所有完数,并输出其因子。一个数若恰好等于它的各因子之和,即称其为完数。例如,6=1+2+3,其中,1、2、3为6的因子,6为因子和。
#include<stdio.h>
int main(void)
{
int i,j,s=1;
for(i=1;i<=200;i++)
{
if(s==i)
printf("%d=1\n",i);
for(j=2;j<=i/2;j++)
{
if(i%j==0)
printf("1+%d",j);
printf("/n");
}

}
return 0;
}
...全文
345 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdukhw 2011-11-03
  • 打赏
  • 举报
回复
/*以下所用到的公式,并非物理公式是很容易想到的编程思路公式.我们只需要利用计算机的高速运算的特点即可.无需考虑它是怎么运行的.思路正确就行*/
#include<stdio.h>
int main()
{
int n,i=1,f=1,m=1;
double h,it,s,d,p=0,sum;
printf("Input height:");
scanf("%lf",&h);
printf("Input n:");
scanf("%d",&n);
s=h;
/*首先计算n次反弹后的高度h 运用程序思维公式h=h-1/2*/
for(i=1;i<=n;i++)
h=h-0.5*h;
printf("height=%.1f\n",h);
/*计算n次反弹后经过的路程s 运用思维公式sum=s+s(1+1/2+1/4....)*/
for(i=1;i<=n;i++){
it=f*1.0/m;/* 此处是(1+1/2+1/4...)部分,f是分子,m是分母*/
p=p+s*it; /* 此处是s(1+1/2+1/4...)部分,然后把和累加到p中*/
sum=p+s; /*此处是sum=s+s(1+1/2+1/4...)部分*/
m=m*2;
}
printf("distance=%.0f",sum);
return 0;
}/* 624宿舍 渐渐被你吸引 为您解答*/
bobo364 2010-03-30
  • 打赏
  • 举报
回复
#include<stdio.h>
int main()
{
int i,j;
int sum=0;
for(i=1;i<=200;i++)
{
for(j=1;j<=i;j++)
{
if(i%j==0)//把每个能被i整除的数都加到一个累加器sum里
{
sum=sum+j;
}
}
if(i!=1)//当i不为1时,每次总是会把i自己加上,比如i=6,循环为1+2+3+6,所以必须减掉自己
{
sum=sum-i;
}
if(sum==i)//这里就是把每个能被整除的数加上和i自己比较,相同为完数,打印输出
{
printf("%d\n",i);
}
sum=0;
}
system("pause");
return 0;
}

第二题
huanmie_09 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 w74839520 的回复:]
引用 20 楼 huanmie_09 的回复:
第二题,刚刚的有点错误:

C/C++ code

#include<stdio.h>

#define MAX_LEN 200

int main(void)
{
int i, j = 2, s = 1;
int arr[MAX_LEN], index = 1;
arr[0] = 1;
for(i = 1; i <= 2……
[/Quote]
我添点注释吧,其实我在5楼说的大概意思就是这个。

#include<stdio.h>

#define MAX_LEN 200

int main(void)
{
/*j表示因子,因为数字1肯定是一个因子了,所以j从2开始.
s表示已经找到的因子和,同样已知1为因子了,所以s初值为1.
*/
int i, j = 2, s = 1;

/*数组中存放每一个因子, index作为数组的索引*/
int arr[MAX_LEN], index = 1;

/*1肯定是一个因子,因此先将1作为因子保存到数组中*/
arr[0] = 1;

for(i = 1; i <= 1000; i++) {
/*找因子的过程*/
while(j <= i/2) {
if(i % j == 0) {/*如果j是i的因子*/
arr[index++] = j; /*将j保存到数组当中*/
s = s + j; /*将j加到s中*/
}
j++; /*判断下一个数是不是i的因子*/
}
if(s == i) { /*因子和与当前数i相等,则它为完数,输出*/
printf("%d=", i);
for(j = 0; j < index-1; j++) { /*这里j临时充当数组下标进行输出*/
printf("%d+", arr[j]);
}
printf("%d\n",arr[j]);
}
s = 1; /*因子和复位*/
index = 1; /*数组索引复位*/
j = 2; /*第一个因子复位*/
}

return 0;
}
bobo364 2010-03-30
  • 打赏
  • 举报
回复
#include<stdio.h>
int main()
{
double i,height,sum=0;
int n;
printf("please input height:");
scanf("%lf",&height);
printf("please input n:");
scanf("%d",&n);//输入与n的类型不匹配,改了就好了
for(i=1;i<=n;i++)
{
sum=sum+height;
height=height/2.0;
}
printf("distance is %.1f\n",sum);
printf("height is %.1f\n",height);
system("pause");
return 0;
}

第一个问题
w74839520 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 huanmie_09 的回复:]
第二题,刚刚的有点错误:

C/C++ code

#include<stdio.h>

#define MAX_LEN 200

int main(void)
{
int i, j = 2, s = 1;
int arr[MAX_LEN], index = 1;
arr[0] = 1;
for(i = 1; i <= 200; i++) ……
[/Quote]

答案没有问题,但是可以优化一下代码么? 新手 看不太懂
pur_e 2010-03-30
  • 打赏
  • 举报
回复
写了个递归的

#include<stdio.h>
bool work(int,int,int);
int main(void)
{
for(int i=1;i<1000;i++)
{
if(work(i/2,i,0))
printf("\n");
}
return 0;
}
bool work(int a,int n,int sum)
{
bool flag;
if(n==1) {printf("1=1");return true;}
if(n%a==0) sum+=a;
if(a==1&&sum==n)
{
printf("%d=1",n);
return true;
}
else if(a==1&&sum!=n)
return false;
flag=work(a-1,n,sum);
if(flag&&n%a==0)
{
printf("+%d",a);
}
return flag;
}
wxwlll 2010-03-30
  • 打赏
  • 举报
回复
你的算法有问题!
huanmie_09 2010-03-30
  • 打赏
  • 举报
回复
第二题,刚刚的有点错误:

#include<stdio.h>

#define MAX_LEN 200

int main(void)
{
int i, j = 2, s = 1;
int arr[MAX_LEN], index = 1;
arr[0] = 1;
for(i = 1; i <= 200; i++) {
while(j <= i/2) {
if(i % j == 0) {
arr[index++] = j;
s = s + j;
}
j++;
}
if(s == i) {
printf("%d=", i);
for(j = 0; j < index-1; j++) {
printf("%d+", arr[j]);
}
printf("%d\n",arr[j]);
}
s = 1; /*复位*/
index = 1;
j = 2;
}

return 0;
}
huanmie_09 2010-03-30
  • 打赏
  • 举报
回复
第二题:

#include<stdio.h>

#define MAX_LEN 200

int main(void)
{
int i, j = 1, s = 1;
int arr[MAX_LEN], index = 1;
arr[0] = 1;
for(i = 1; i <= 200; i++) {
while(j <= i/2) {
if(i % j == 0) {
arr[index++] = j;
s = s + j;
}
j++;
}
if(s == i) {
printf("%d=", i);
for(j = 0; j < index-1; j++) {
printf("%d+", arr[j]);
}
printf("%d\n",arr[j]);
}
s = 1; /*复位*/
index = 1;
j = 1;
}

return 0;
}
linyongzuo 2010-03-30
  • 打赏
  • 举报
回复

#include<stdio.h>
int main()
{

int sum = 0;
for( int i = 1; i <= 200; i++ )
{
for( int j = 1; j <= i; j++ )
{
if( i%j == 0 )
{
sum = sum + j;
}
}
if( i != 1 )
{
sum = sum - i;
}
if( sum == i )
{
printf( "%d\n",i );
}
sum = 0;
}
return 0;
}

...这样总可以了把
wesweeky 2010-03-30
  • 打赏
  • 举报
回复
写个通项公式 直接输出。。
「已注销」 2010-03-30
  • 打赏
  • 举报
回复
你可以做两个等比数列处理
w74839520 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 linyongzuo 的回复:]
C/C++ code

#include<iostream>
using namespace std;
int main()
{

int sum = 0;
for( int i = 1; i <= 200; i++ )
{
for( int j = 1; j <= i; j++ )
{
if(……
[/Quote]


我要C的代码。。

VC6.0提示C++
huanmie_09 2010-03-30
  • 打赏
  • 举报
回复
第一题:

#include<stdio.h>

int main()
{
double i, height, sum = 0;
int n;
printf("please input height: ");
scanf("%lf",&height);

sum = height;

printf("please input n:");
/*scanf("%lf",&n);*/
scanf("%d", &n);

for(i = 2; i <= n; i++) {
sum = sum + height;
height = height / 2.0;
}
printf("distance is %.1f\n", sum);
printf("height is %.1f\n", height / 2);
return 0;
}
w74839520 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 linyongzuo 的回复:]
C/C++ code

#include<iostream>
using namespace std;
int main()
{

int sum = 0;
for( int i = 1; i <= 200; i++ )
{
for( int j = 1; j <= i; j++ )
{
if(……
[/Quote]

没注意 同时在干其他的事儿 不好意思 我试一试先
linyongzuo 2010-03-30
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;
int main()
{

int sum = 0;
for( int i = 1; i <= 200; i++ )
{
for( int j = 1; j <= i; j++ )
{
if( i%j == 0 )
{
sum = sum + j;
}
}
if( i != 1 )
{
sum = sum - i;
}
if( sum == i )
{
cout<<i<<endl;
}
sum = 0;
}
return 0;
}

老大。。。我难道还要把头文件这样的东西给你贴过来?
我都运行正确了才发的
w74839520 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhao4zhong1 的回复:]
单步调试和设断点调试是程序员必须掌握的技能之一。
[/Quote]
谢谢 先把这两道题解决先
w74839520 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 linyongzuo 的回复:]
C/C++ code

int main()
{

int sum = 0;
for( int i = 1; i <= 200; i++ )
{
for( int j = 1; j <= i; j++ )
{
if( i%j == 0 )
{
……
[/Quote]

N多错误。。。
赵4老师 2010-03-30
  • 打赏
  • 举报
回复
单步调试和设断点调试是程序员必须掌握的技能之一。
linyongzuo 2010-03-30
  • 打赏
  • 举报
回复

int main()
{

int sum = 0;
for( int i = 1; i <= 200; i++ )
{
for( int j = 1; j <= i; j++ )
{
if( i%j == 0 )
{
sum = sum + j;
}
}
if( i != 1 )
{
sum = sum - i;
}
if( sum == i )
{
cout<<i<<endl;
}
sum = 0;
}
return 0;
}

第2题
加载更多回复(7)

69,380

社区成员

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

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