题目分析
题目中定义函数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;
}