Project Euler #16

下位のコメントアウトは、何故正解が合わないのかよくわからない。

係数の取り出しはうまくいっているみたいなので、
おそらく num *= 2;に誤差発生したのだと思われる。


そこで、配列を用いることにした。


全ての要素を2倍した後、繰り上げを考慮する。
この際に、ループは同時に回してはならない。
繰り上げ後の数を2倍してしまうからである。
したがって、2倍と繰り上げは分けてループすること







/*---------------------------------------------------------------------->
Problem 16 †
/*---------------------------------------------------------------------->
2^15 = 32768 であり、これの各数字の合計は 3 + 2 + 7 + 6 + 8 = 26 となる。

同様にして、2^1000 の各数字の合計を求めよ。
------------------------------------------------------------------------>
*/

#include<iostream>
#include <math.h>
#include<util.h>
using namespace std;

#define COEF    1000
#define NUM_MAT 1024

int main( void ){

int num[ NUM_MAT ]={ 0 };
num[ 0 ]          = 1;
int cnt = 0;
int sum = 0;

for( int i = 0; i < COEF; i ++){
for( int j = 0 ; j < NUM_MAT ; j++){
if( num[ j ] != 0){
num[ j ] *=2; //要素を二倍
if( j > cnt) cnt = j; //最大配列数
}//End if
}//Next i

for( int j = 0; j <= cnt ; j++){

//2倍が終わったあとで、繰り上げを考慮する
if( num[ j ] > 9 ){
num[ j+1 ] += (int)floor( (double)num[ j ] /10 );
num[ j ] = num[ j ] %10;
}//End if



}//Next j
}//Next j

for( int i = cnt + 1; i >=0 ; i-- ){
sum += num[ i ];
cout << num[ i ];
}//Next i;

cout << "\n Answer is \t" << sum;
getchar();
return 0;

/*
long double num = 1;
long double ans = 0;
long double diff;

for( int i = 0; i < COEF ; i++ ){
num *= 2;
}

printf("%lf\n",num);

while( num > 0 ){

diff = fmod( num , 10 );

ans += diff;

cout << "num\t" << num << "\t diff\t" << diff << "\t ans \t"<< ans <<"\n";

num /= 10;
num = floor( num );

}

//cout << "Answer is " <<ans;
getchar();
return 0;
*/
}