【swustoj274】函数求值。详解

题目分析

题目中定义函数g(n)为n的最大奇数因子。我们很容易就脑海里面出现了一个想法,如果n是奇数那么g(n)的值便等于n,如果n是偶数,那么就对n一直除以2,一直到剩下的数是奇数,假设这个数是m吧,那么g(n)就应该等于m,然后把g(1)到g(n)都进行这个操作,并把他们的返回值加起来,就是最后的结果,这个思路是没有问题的,但是这是典型的暴力行为。
原文链接:https://blog.csdn.net/weixin_62268437/article/details/127131706

(此博主已经给出部分详细解答,在此我就不多赘述,只对如何得出前n项和做具体阐述)

具体部分分析如下:

(纠正上述:n=1的时候不是特例,只是相比于循环写出的代码递归要特判一下)

递归代码:

#include<stdio.h>	
long long n;
long long f(long long n){
	if(n==1)return 1;
	else if(n%2!=0) return (n+1)*(n+1)/4+f(n/2);
	else return n*n/4+f(n/2);

}
int main(){
	while(scanf("%lld",&n)!=EOF){
		printf("%lld\n",f(n));
	} 
	return 0;
} 

循环代码

#include<stdio.h>
int main()
{
	long long n;
	while(scanf("%lld",&n)!=EOF)
	{
		long long sum=0;
		while(n!=0)
		{
			if(n%2!=0) sum+=(n+1)*(n+1)/4;
			else sum+=n*n/4;
			n/=2;
		}
		printf("%lld\n",sum);
	}
	return 0;
}

暴力解法  报错TLE

#include <iostream>
using namespace std;
int main()
{
    int n=0;
    while (scanf("%d", &n) != EOF) {  
        long long sum=0;
        for (int i = 1; i <=n; i++) {
            if (i % 2 != 0) {
                sum += i;//为奇数加本身 
            }
            else{//为偶数 除以2为奇即可 
                int temp = i / 2;
               for(;temp%2==0;){
               	temp/=2;
			   }
			   sum+=temp;
            }
        }
        cout<<sum << endl;
    }
    return 0;
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值