Problem #013
✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺/etc

Problem #013

오일러 알고리즘

🚩 문제 설명

◾ 50자리 수의 수가 100개가 주어진다.

◾ 해당 수들을 다 더한 합의 10번째 자리 수는 무엇인지 구하는 문제

 

 


 

 

📑 문제 풀이

#include <iostream>
#define ll long long
using namespace std;

string str = "37107287533902102798797998220837590246510135740250463769376774900097126481248969700780504170182605387432498619952474105947423330951305812372661730962991942213363574161572522430563301811072406154908250230675882075393461711719803104210475137780632466768926167069662363382013637841838368417873436172675728112879812849979408065481931592621691275889832738442742289174325203219235894228767964876702721893184745144573600130643909116721685684458871160315327670386486105843025439939619828917593665686757934951621764571418565606295021572231965867550793241933316490635246274190492910143244581382266334794475817892575867718337217661963751590579239728245598838407582035653253593990084026335689488301894586282278288018119938482628201427819413994056758715117009439035398664372827112653829987240784473053190104293586865155060062958648615320752733719591914205172558297169388870771546649911559348760353292171497005693854370070576826684624621495650076471787294438377604532826541087568284431911906346940378552177792951453612327252500029607107508256381565671088525835072145876576172410976447339110607218265236877223636045174237069058518606604482076212098132878607339694128114266041808683061932846081119106155694051268969251934325451728388641918047049293215058642563049483624672216484350762017279180399446930047329563406911573244438690812579451408905770622942919710792820955037687525678773091862540744969844508330393682126183363848253301546861961243487676812975343759465158038628759287849020152168555482871720121925776695478182833757993103614740356856449095527097864797581167263201004368978425535399209318374414978068609844840309812907779179908821879532736447567559084803087086987551392711854517078544161852424320693150332599594068957565367821070749269665376763262354472106979395067965269474259770973916669376304263398708541052684708299085211399427365734116182760315001271653786073615010808570091499395125570281987460043753582903531743471732693212357815498262974255273730794953759765105305946966067683156574377167401875275889028025717332296191766687138199318110487701902712526768027607800301367868099252546340106163286652636270218540497705585629946580636237993140746255962240744869082311749777923654662572469233228109171419143028819710328859780666976089293863828502533340334413065578016127815921815005561868836468420090470230530811728164304876237919698424872550366387845831148769693215490281042402013833512446218144177347063783299490636259666498587618221225225512486764533677201869716985443124195724099139590089523100588229554825530026352078153229679624948164195386821877476085327132285723110424803456124867697064507995236377742425354112916842768655389262050249103265729672370191327572567528565324825826546309220705859652229798860272258331913126375147341994889534765745501184957014548792889848568277260777137214037988797153829820378303147352772158034814451349137322665138134829543829199918180278916522431027392251122869539409579530664052326325380441000596549391598795936352974615218550237130764225512118369380358038858490341698116222072977186158236678424689157993532961922624679571944012690438771072750481023908955235974572318970677254791506150550495392297953090112996751986188088225875314529584099251203829009407770775672113067397083047244838165338735023408456470580773088295917476714036319800818712901187549131054712658197623331044818386269515456334926366572897563400500428462801835170705278318394258821455212272512503275512160354698120058176216521282765275169129689778932238195734329339946437501907836945765883352399886755061649651847751807381688378610915273579297013376217784275219262340194239963916804498399317331273132924185707147349566916674687634660915035914677504995186714302352196288948901024233251169136196266227326746080059154747183079839286853520694694454072476841822524674417161514036427982273348055556214818971426179103425986472045168939894221798260880768528778364618279934631376775430780936333301898264209010848802521674670883215120185883543223812876952786713296124747824645386369930090493103636197638780396218407357239979422340623539380833965132740801111666627891981488087797941876876144230030984490851411606618262936828367647447792391803351109890697907148578694408955299065364044742557608365997664579509666024396409905389607120198219976047599490197230297649139826800329731560371200413779037855660850892521673093931987275027546890690370753941304265231501194809377245048795150954100921645863754710598436791786391670211874924319957006419179697775990283006991536871371193661495281130587638027841075444973307840789923115535562561142322423255033685442488917353448899115014406480203690680639606723221932041495354150312888033953605329934036800697771065056663195481234880673210146739058568557934581403627822703280826165707739483275922328459417065250945123252306082291880205877731971983945018088807242966198081119777158542502016545090413245809786882778948721859617721078384350691861554356628840622574736922845095162084960398013400172393067166682355524525280460972253503534226472524250874054075591789781264330331690";


int main()
{
	ll sum = 0;

	for (ll i = 0; i < str.size(); i+=50)
	{
		string str2 = "";
		for (int j = 0; j <= 11; j++)
		{
			str2 = str2 + str[i + j];
		}
		sum = sum + atoll(str2.c_str());
	}

	cout <<"sum: "<< sum << "\n";

	return 0;
}

💬 Point

👉 Big Interger 문제
👉 문자열로 저장
👉 50자리씩 끊어서 저장
👉 처음 12자리만 구해보기

◾ 첫번째 반복문은 50씩 더해지면서 돈다.

  • 돌아가는 변수의 숫자도 무척 커지기 때문에 long long으로 두기

◾ 두번째 반복문은  0 ~ 11 만큼 돈다. 즉 12번 도는 것.

i j i + j
0 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
50 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61
100 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111
  • 이렇게 하는 이유는 처음 10자리만 구하면 되기 때문에
  • 굳이 처음부터 50자리 까지 다 더하지않고, 12자리 까지만 더해서 구했다.

 

 


 

 

But,

✅ 파일로 해당 50자리 수들을 저장할 수 있다.
✅ 파이썬으로 풀면 엄청 쉽게 풀린다고 한다.
✅ 하지만 나는 C++을 통해서 풀고 싶었다.

➕ 풀이 사이트 첨부

https://www.mathblog.dk/project-euler-13/

 

Solution to Project Euler 13: Sum of 50-digit numbers in C# | MathBlog

Problem 13 of Project Euler reads: Work out the first ten digits of the sum of the following one-hundred 50-digit numbers With the development of .NET 4.0 you can make a short cut and the solution becomes rather trivial as I am about to show you.

www.mathblog.dk

 

 

 

 

 

 

 

 


 

728x90

'✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺 > etc' 카테고리의 다른 글

Problem #015  (0) 2020.02.07
Problem #014  (0) 2020.02.05
Problem #011  (0) 2020.01.31
Problem #010  (0) 2020.01.30
Problem #008  (0) 2020.01.28