class solution {
public solution(){
valeur1=new int[16];
operation=new char[16];
valeur2=new int[16];
resultat=new int[16];}
public void setValeur1(int l, int val) {valeur1[l]=val;}
public void setOperation(int l, char ch) {operation[l]=ch;}
public void setValeur2(int l, int val) {valeur2[l]=val;}
public void setResultat(int l, int res) {resultat[l]=res;}
public int getValeur1(int l) {return valeur1[l];}
public char getOperation(int l) {return operation[l];}
public int getValeur2(int l) {return valeur2[l];}
public int getResultat(int l) {return resultat[l];}
public String affiche(int l) {String leCompteEstBon_solution=""+l;String difficult_string="";int difficult=0;int difficult_maxi=0;
for(int i=6;i>l;i--){char opera=operation[i];
if(operation[i]=='*')opera='\u00D7'; if(operation[i]=='/')opera='\u00F7';
difficult=difficulte(valeur1[i],valeur2[i],opera);
if(i>l+1)difficult_string+=difficult+" ";else difficult_string+=difficult;
if(difficult>difficult_maxi)difficult_maxi=difficult;
leCompteEstBon_solution+=""+valeur1[i]+opera+valeur2[i]+"="+resultat[i]+" ";}
leCompteEstBon_solution+="D="+difficult_maxi+"("+difficult_string+")";
return leCompteEstBon_solution;}
public int difficulte(int a,int b,char c) {int d=0; if(a<b){d=b;b=a;a=d;}
if(c=='+')d=diffAdd(a,b);
else if(c=='\u00D7')d=diffMul(a,b);
else if(c=='-'){if(a%10==0) d=diffAdd(a-b,b);else d=diffAdd(a-b,b)+1;} //soustraction facile si complément à 10
else d=diffMul(b,a/b)+1; //division
return d;}
//*****************************************************************chiffrage de la difficulté d'une addition******************************
public int diffAdd(int a,int b) {if(a<b){int d=b;b=a;a=d;}//a >= b //on prend en premier le plus grand des deux...
if(b<10){if((a+b)%10==0){if(a/10==0||a/10==9)return 1; //complément simple à la dizaine ou à la centaine ex 6+4, 98+2
else return 2;} //complément à la dizaine ou à la centaine et retenue ex 36+4, 198+2
else return diffAdd1(a,b); } //addition d'un chiffre seul ex 30+5, 31+5, 37+5, 137+5, etc.
else{if(a%10==0&&b%10==0)return diffAdd(a/10,b/10); //addition de dizaines seules ex 30+20
else if(a%100+b%100==100){if(a/100+b/100==0)return 2;//complément à la centaine sans retenue ex 76+24
else return 3;} //complément à la centaine avec retenue ex 176+24
else if(a%10+b%10<10)return diffAdd(a/10,b/10)+1; //pas de retenue ex 35+21
else if(a%10+b%10==10)return diffAdd(a/10,b/10)+2;//complément à la dizaine ex 56+14, 156+64
else if((a/10+b/10)%10==9)return diffAdd(a/10,b/10)+4;//la retenue se propage ex 35+67
else return diffAdd(a/10,b/10)+3;}} //une retenue qui ne se propagera pas ex 35+27, 135+27
public int diffAdd1(int a,int b) {if(a<10)if(a+b<10)return 1; //pas de retenue ex 3+2
else return 2; //pas de retenue ex 8+3
else if(a%10+b<10)return 1; //pas de retenue ex 30+4, 35+4
else if((a/10)%10==9){if(a/10==9)return 4; //une retenue qui se propage sans addition complémentaire ex 95+6
else return 5;} //une retenue qui se propage avec addition complémentaire ex 195+6
else return 3;} //une retenue qui ne se propagera pas ex 35+7
//*****************************************************************chiffrage de la difficulté d'une multiplication************************
public int diffMul(int a,int b) {if(a<b){int d=b;b=a;a=d;}//a >= b //on prend en premier le plus grand des deux...
if(b<10) if(a%10==0)return diffMul(a/10,b); //un zéro qui ne change pas la difficulté
else if(a==25||a==15){if(b>4)return 3;else return 2;} //cas particulier1 multiplication par 25 ou 15 ex 25*3
else if(a==75){if(b>2)return 4;else return 2;} //cas particulier2 multiplication par 75 ex 75*5
else if(a==125){if(b==4||b==2)return 2;else return 4;}//cas particulier3 multiplication par 125 ex 125*3
else return diffMul1(a,b); //cas général ex 21*6
else if(b<100){if(a%10==0&&b%10==0)return diffMul(a/10,b/10)+1; //un zéro de part et d'autre qu'il faut additionner
else if(a%10==0||b%10==0){if(a%10==0)return diffMul(a/10,b); //un zéro qui ne change pas la difficulté
else return diffMul(a,b/10);} //un zéro qui ne change pas la difficulté
else if(a==25||b==25)return 4; //cas particulier1 multiplication par 25 ex 25*13
else if(a==75||b==75)return 5; //cas particulier2 multiplication par 75 ex 75*13
else return diffAdd(a*(b%10),a*(b/10)*10)+4;}//cas général ex 23*36
else {if(a%10==0&&b%10==0)return diffMul(a/10,b/10)+1; //un zéro de part et d'autre qu'il faut additionner
else if(a%10==0||b%10==0){if(a%10==0)return diffMul(a/10,b); //un zéro qui ne change pas la difficulté
else return diffMul(a,b/10);} //un zéro qui ne change pas la difficulté
else if((b/10)%10==0)return diffAdd(a*(b%10),a*(b/100))+6;//cas revenant au précédent ex 103*136
else return diffAdd(a*(b%10),(a*(b/10)%10)*10)+diffAdd(a*(b%100),a*(b/100)*100)+9;} //cas général ex 153*136
} //ici on ne prends pas vraiment en compte la simplification d'une multiplication par 11 (ou 21, 31, etc)
//cela donne en général des indice trop grands - exemples : 76x8(D=6) 192x4(D=9) 14x51(D=11) alors qu'en faisant 14x50 et 14x1 on trouverai D=4+
//idem pour les multiplications par 5 ou 50, etc.
public int diffMul1(int a,int b) {if(a<10){if(a*b<10)return 1;else return 2;} //cas général à 1 chiffre (les tables)
else if(a<100)return diffAdd(b*(a%10),b*(a/10)*10)+3; //cas général à 2 chiffres pour 21*6 on additionne 6 et 120
else if((a/10)%10==0)return diffAdd(b*(a%10),b*(a/100)*100)+3; //cas revenant au précédent ex 103*6
else return diffAdd(b*(a%10),b*(a/10)*10)+diffAdd(b*(a%100),b*(a/100)*100)+5;//cas général à 3 chiffres pour 421*6 on additionne 6,120 et 2400
}
//****************************************************************************************************************************************
private int valeur1[];
private char operation[];
private int valeur2[];
private int resultat[];
}