设计一个函数,计算s=1-2+3-4+5-6+…±N的值,要求时间复杂度为O(1),越简洁独特越好
答案:5 悬赏:0 手机版
解决时间 2021-03-21 21:09
- 提问者网友:一抹荒凉废墟
- 2021-03-21 03:38
设计一个函数,计算s=1-2+3-4+5-6+…±N的值,要求时间复杂度为O(1),越简洁独特越好
最佳答案
- 五星知识达人网友:天凉才是好个秋
- 2021-03-21 04:07
可以用公式的
观察到
1-2=-1
3-4=-1
5-6=-1
如果n是奇数的话
答案是-(n-1)/2+n
如果N是偶数的话答案是-n/2
#include
#include
int sum(int n)
{
if(n%2==1)return -(n-1)/2+n;
else return -n/2;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d\n",sum(n));
return 0;
}
观察到
1-2=-1
3-4=-1
5-6=-1
如果n是奇数的话
答案是-(n-1)/2+n
如果N是偶数的话答案是-n/2
#include
#include
int sum(int n)
{
if(n%2==1)return -(n-1)/2+n;
else return -n/2;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d\n",sum(n));
return 0;
}
全部回答
- 1楼网友:不甚了了
- 2021-03-21 08:06
int fun(int s,int i){//主函数中调用的时候要s=0,i=0;
if(i<100000){
i++;
s+=i
s=fun(s,i);
}
else{
return s;
}
return s;
}
if(i<100000){
i++;
s+=i
s=fun(s,i);
}
else{
return s;
}
return s;
}
- 2楼网友:雾月
- 2021-03-21 07:20
化简表达式:
s = 1-2+3-4+5-6+...±N
=(1-2)+(3-4)+(5-6)...(N-1-N) =-1-1-1-1-1...-1=-N/2 (N为偶数)
=(1-2)+(3-4)+(5-6)...+N = -1-1-1-1-1-1...-1+N=-(N-1)/2+N=N/2+1/2=(N+1)/2 (N为奇数)
则可得以下函数:
int function(int nT)
{
return ((nT%2)?((nT+1)/2):(-nT/2));
}
那么从函数来看,function中nT%2步数为1,后面的两个算式均为1,而两个算是只会执行一个,return步数为1,那么function的步数为3,时间复杂度为T(function) = O(1),符合要求
s = 1-2+3-4+5-6+...±N
=(1-2)+(3-4)+(5-6)...(N-1-N) =-1-1-1-1-1...-1=-N/2 (N为偶数)
=(1-2)+(3-4)+(5-6)...+N = -1-1-1-1-1-1...-1+N=-(N-1)/2+N=N/2+1/2=(N+1)/2 (N为奇数)
则可得以下函数:
int function(int nT)
{
return ((nT%2)?((nT+1)/2):(-nT/2));
}
那么从函数来看,function中nT%2步数为1,后面的两个算式均为1,而两个算是只会执行一个,return步数为1,那么function的步数为3,时间复杂度为T(function) = O(1),符合要求
- 3楼网友:煞尾
- 2021-03-21 06:27
sum = (0 - (n >> 1)) - ((n & 0x01) ? n : 0);
- 4楼网友:独行浪子会拥风
- 2021-03-21 05:27
1楼的有点问题,中间应该是加
sum = (0 - (n >> 1)) + ((n & 0x01) ? n : 0);
1楼的是最标准的答案了,一看就知道C的功底相当厉害。
只可惜楼主没采纳。遗憾。
sum = (0 - (n >> 1)) + ((n & 0x01) ? n : 0);
1楼的是最标准的答案了,一看就知道C的功底相当厉害。
只可惜楼主没采纳。遗憾。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯