"""
exercice 2.19
              question 1 : Décomposition d'un entier comme somme d'entiers consécutifs
              question 2 : Entiers à partir duquel on a 1, 2, 3, etc. décompositions différentes
"""
#question 1 : exploration de l'écriture des entiers comme somme d'entiers consécutifs.
def decomposition1(N):
    for n in range(1,N+1) :
        solutions=[]
        for premier_terme in range(1,n//2+1) :
            somme_string=str(premier_terme)+"+"
            somme,k=premier_terme,premier_terme
            while somme<n :
                k+=1
                somme+=k
                somme_string+=str(k)
                if somme<n : somme_string+="+"
            if somme==n :
                solutions.append(somme_string)
        print("{} = {}".format(n,solutions))
    
#question 2 : Entiers à partir duquel on a 1, 2, 3, etc. décompositions différentes
#             la version decomposition2 affiche la liste des nombres ayant 1, 2, 3, etc. décompositions 
#             la version decomposition3 affiche la tête de liste (le premier) des nombres ayant 1, 2, 3, etc. décompositions 
def decomposition2(N):
    tableau=[]
    maxi=0
    for n in range(1,N+1) :
        solutions=[]
        for premier_terme in range(1,n//2+1) :
            somme_string=str(premier_terme)+"+"
            somme,k=premier_terme,premier_terme
            while somme<n :
                k+=1
                somme+=k
                somme_string+=str(k)
                if somme<n : somme_string+="+"
            if somme==n :
                 solutions.append(somme_string)
        tableau.append([n,len(solutions)])
        if len(solutions)>maxi : maxi=len(solutions)
    for i in range(maxi+1) :
        string="Nombres ayant {} décompositions : ".format(i)
        for j in range(N) :
            if tableau[j][1]==i : string+=" "+str(tableau[j][0])
        print(string)
        
def decomposition3(N):
    tableau=[]
    maxi=0
    for n in range(1,N+1) :
        solutions=[]
        for premier_terme in range(1,n//2+1) :
            somme_string=str(premier_terme)+"+"
            somme,k=premier_terme,premier_terme
            while somme<n :
                k+=1
                somme+=k
                somme_string+=str(k)
                if somme<n : somme_string+="+"
            if somme==n :
                 solutions.append(somme_string)
        tableau.append([n,len(solutions)])
        if len(solutions)>maxi : maxi=len(solutions)
    for i in range(maxi+1) :
        string="Premier nombre ayant {} décompositions : ".format(i)
        for j in range(N) :
            if tableau[j][1]==i :
                string+=" "+str(tableau[j][0])
                print(string)
                break
        
 
decomposition3(10000)
