c语言算法题

发布网友

我来回答

4个回答

热心网友

一、算法分析:

要计算a b之间所有奇数和,那么最朴素的算法可以设计如下:

1、输入a,b值;

2、循环遍历a b之间的所有数值,如果为奇数,则累加;

3、输出结果。

二、算法优化:

1、由于连续奇数之间差值为2,所以可以判断出第一个奇数,然后依次加2得到所有奇数,将所有奇数累加即可。

2、连续奇数属于等差数列,所以可以利用等差数列求和公式,更快捷的得到结果。

三、参考代码:

1、原始算法代码:

#include <stdio.h>
int add(int a, int b)
{
    int m,n,s=0;
    if(a<b) m=a,n=b;
    else m=b,n=a;//判断a b大小,增加健壮性。
    
    for(; m<=n; m ++)
        if(m%2==1) s+=m;//判断并累加奇数。
    return s; //返回结果。
}

int main()
{
    int a,b;
    scanf("%d%d",&a,&b);//输入a,b值。
    printf("%d\n", add(a,b));//计算并输出结果。
    return 0;
}

2、优化算法1:

#include <stdio.h>
int add(int a, int b)
{
    int m,n,s=0;
    if(a<b) m=a,n=b;
    else m=b,n=a;//判断a b大小,增加健壮性。
    if(m%2==0) m+=1;//找到第一个奇数。
    for(; m<=n; m +=2)//仅遍历奇数。
        s+=m;//累加奇数。
    return s; //返回结果。
}

int main()
{
    int a,b;
    scanf("%d%d",&a,&b);//输入a,b值。
    printf("%d\n", add(a,b));//计算并输出结果。
    return 0;
}

3、优化算法2:

#include <stdio.h>
int add(int a, int b)
{
    int m,n,s=0;
    if(a<b) m=a,n=b;
    else m=b,n=a;//判断a b大小,增加健壮性。
    if(m%2==0) m+=1;//找到第一个奇数。
    if(n%2==0) n-=1;//找到最后一个奇数。
    s=(m+n)*((n-m)/2+1)/2;//根据等差数列求和公式计算和。
    return s; //返回结果。
}

int main()
{
    int a,b;
    scanf("%d%d",&a,&b);//输入a,b值。
    printf("%d\n", add(a,b));//计算并输出结果。
    return 0;
}

热心网友

你这是C++,不是C。

#include <stdio.h>

int main()
{
  long sum = 0;
  int a, b, i;
  scanf("%d%d", &a, &b);
  for (i = a; i <= b; i++)
    if(i % 2 != 0) sum += i;
  printf("%ld\n", sum);
  return 0;
}

热心网友

它有说a<=b吗?如果ab相差很大,会超时吗?
得了多少分,评测结果具体是什么,都粘出来,方便我们查错。追问

它有说a<=b吗?如果ab相差很大,会超时吗?     这个很有可能

得了多少分,评测结果具体是什么,都粘出来,方便我们查错。

追答

额,什么评测网站竟然不给分数。好像没有超时。我写了一段:

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
    int m, n, t;
    cin >> m >> n;
    if (m > n){
        t = m;
        m = n;
        n = t;
    }
    if (m % 2 == 0)
       m++;
    if (n % 2 == 0)
       n--;
    if (m > n)
        cout << 0 << endl;
    else
        cout << ((m + n) * (n - m + 2) / 4) << endl;
    //system("pause");
    return 0;
}

 等差数列求和公式:(首项+末项) * 项数 / 2

热心网友

可能是你的算法有问题, 其实可以完全用等差数列求和公式来算.追问公式是什么

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com