标题:程序简化(有两道题,我自己写了程序,希望大家看看能不能有所改进或更简单 ...
只看楼主
qishi123
Rank: 1
等 级:新手上路
帖 子:78
专家分:9
注 册:2012-9-5
结帖率:78.57%
已结贴  问题点数:20 回复次数:10 
程序简化(有两道题,我自己写了程序,希望大家看看能不能有所改进或更简单的程序)
1。计算s=1!-2!+3!-…+n!,n由键盘输入;
#include <stdio.h>
void main()
{
int n,i,j=1,k=-1;
double s=1.0;
printf("please input n:");
scanf("%d",&n);
for(i=2;i<=n;i++)
{
j=j*i;
s=s+j*k;
k=k*(-1);
}
printf("s=%f",s);
}
2.求s=1+3+5+…+n,当s刚好大于3000时n的值,输出n与s。
#include <stdio.h>
void main()
{
int n,j,s=0;
for(n=1;s<=3000;n++)
{j=2*n-1;
s=s+j;
}
printf("n=%d,s=%d",n,s);
搜索更多相关主题的帖子: please include double 
2012-10-19 07:50
lylhe
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2012-10-18
得分:3 
你的第一条题目解答是错的,不信你自己带数字进去算下。
我的思路是这样的. 我估摸着我这个做法是复杂了点,希望大家简化下。
char sign;
int i,k,b=1,sum=0;
for(i=1;i<n+1;i++)
{
 if(i%2){sign=1;}
 else {sign=-1;}
 for(k=1;k<i+1;k++)
  {
   b=b*k;
  }
sum=sum+b*sign;
}


[ 本帖最后由 lylhe 于 2012-10-19 13:12 编辑 ]
2012-10-19 09:15
lylhe
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2012-10-18
得分:0 
第2条题目你演算下,貌似也出错了。
我的思路是这样的,有点复杂。
int b,s;
while(!(n%2));//判断输入的数是否是奇数
b=n/2+1;
if(b%2)
{
 s=(n+1)*2+(n+1)/2;
 if(s>3000){printf....}
}
else
{
s=(n+1)*3;
if(s>3000){printf....}
}


[ 本帖最后由 lylhe 于 2012-10-19 13:12 编辑 ]
2012-10-19 09:29
Andony
Rank: 2
等 级:论坛游民
帖 子:38
专家分:60
注 册:2012-9-12
得分:14 
LZ 算法没有错,个人建议可以写成 *=  += 的形式,这样不用再取之前的数了。

重复的事情用心做,你就是赢家
2012-10-19 09:43
Andony
Rank: 2
等 级:论坛游民
帖 子:38
专家分:60
注 册:2012-9-12
得分:0 
回复 3楼 lylhe
while(n/2)是在判断奇数么?而且思路乍一看不知道在干什么,就不想再看下去了

[ 本帖最后由 Andony 于 2012-10-19 09:47 编辑 ]

重复的事情用心做,你就是赢家
2012-10-19 09:45
babylco0
Rank: 2
等 级:论坛游民
威 望:1
帖 子:8
专家分:60
注 册:2012-10-18
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h> 

//使用递归求n的阶乘,如果n为偶数, 则结果为n阶乘的负数
long recursion(long n)
{
     if(n <= 1)
     {
          return 1;
     }
     else
     {
         return n * recursion(n - 1)*(-1);
     }
}
//使用递归求和
long sumN(long n)
{
     if(n <= 1)
     {
          return 1;
     }
     else
     {
         return recursion(n) + sumN(n - 1);
     }
}
int main()
{
    long n;
    long result = 0;
    int sig = 1;
    scanf("%d",&n);
   
    printf("result = %ld\n",sumN(n));
   
    system("PAUSE");
}

第一题,使用递归方式求和。
2012-10-19 11:48
qishi123
Rank: 1
等 级:新手上路
帖 子:78
专家分:9
注 册:2012-9-5
得分:0 
回复 3楼 lylhe
第二个输出的确有问题,应该为:
#include <stdio.h>
void main()
{
int n,i,s=0;
for(i=1;s<=3000;i++)
{n=2*i-1;
s+=n;
}
printf("n=%d,s=%d",n,s);
}
2012-10-19 12:11
lylhe
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2012-10-18
得分:0 
回复 7楼 qishi123
是的我马虎了。写的不对。
2012-10-19 13:13
lylhe
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2012-10-18
得分:1 
回复 5楼 Andony
是的,我马虎了,写的不对,谢谢!
2012-10-19 13:13
梅可伟
Rank: 2
等 级:论坛游民
帖 子:16
专家分:65
注 册:2012-10-19
得分:2 
第二题可以这样做
#include <stdio.h>
void main()
{
    int n=1,s=0;
    while(s<=3000)
    {
        s=s+n;
        n+=2;
    }
    printf("%d,%d\n",n,s);
}
2012-10-19 13:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-383586-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.161805 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved