一道c语言的题目:计算a、b之间所有奇数的和
试题描述根据输入的a、b的值,计算a、b间(含a、b)所有奇数的和输入输入包括两个正整数a和b,且a和b在int32范围内输出输出所求的奇数和输入示例13输出示例4我的程...
试题描述
根据输入的a、b的值,计算a、b间(含a、b)所有奇数的和
输入
输入包括两个正整数a和b,且a和b在int32范围内
输出
输出所求的奇数和
输入示例
1 3
输出示例
4
我的程序:
#include<iostream>
using namespace std;
int main()
{
long long sum = 0,i,n,m;
cin>>n>>m;
for( i = n ; i <= m ; i++ )
if(i%2!=0)sum += i;
cout<<sum<<endl;
//system("pause");
return 0;
}
但提交到某个网站测评说结果错误。。。这么个水题呀,竟被我交了七八次也没通过。。。恳请高手请教!!1 展开
根据输入的a、b的值,计算a、b间(含a、b)所有奇数的和
输入
输入包括两个正整数a和b,且a和b在int32范围内
输出
输出所求的奇数和
输入示例
1 3
输出示例
4
我的程序:
#include<iostream>
using namespace std;
int main()
{
long long sum = 0,i,n,m;
cin>>n>>m;
for( i = n ; i <= m ; i++ )
if(i%2!=0)sum += i;
cout<<sum<<endl;
//system("pause");
return 0;
}
但提交到某个网站测评说结果错误。。。这么个水题呀,竟被我交了七八次也没通过。。。恳请高手请教!!1 展开
展开全部
一、算法分析:
要计算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相差很大,会超时吗?
得了多少分,评测结果具体是什么,都粘出来,方便我们查错。
得了多少分,评测结果具体是什么,都粘出来,方便我们查错。
追答
额,什么评测网站竟然不给分数。好像没有超时。我写了一段:
#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
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可能是你的算法有问题, 其实可以完全用等差数列求和公式来算.
追问
公式是什么
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询