Вы можете использовать динамический подход, также используя вспомогательные пробелы
int sum=0;
int a[n+1];
for(int i=1;i<=n;i++){
if(i%2!=0)
a[i] = i;
else
a[i] = a[i/2];
}
for(int i=1;i<=n;i++){
sum+=a[i];
}
cout<<sum;
Так как, когда число нечетное, само число будет наибольшим нечетным делителем, а [i] будет хранить его значение, а когда число четное.тогда a [число / 2] будет сохранено в [i], потому что для четного числа наибольший нечетный делитель числа / 2 будет наибольшим нечетным делителем числа.
Это также можно решить с помощьюв трех случаях, когда число нечетное, добавьте еще одно число, если число является степенью 2, затем добавьте еще 1, если число четное, за исключением степени 2, разделите его на 2, пока не получите нечетное число, и добавьте это нечетное к сумме.