J'ai un programme qui continue à donner une sortie étrange. La sortie était censée être "110". Quel est le problème?Corruption de mémoire de chaîne dans le programme C++
Il est supposé lire un nombre dans un fichier et générer le nombre le plus élevé plus grand que l'entrée qui a la somme de tous les chiffres sur des positions inégales égale à la somme de tous les chiffres sur des positions paires. L'entrée est "99".
EDIT: Fixe! Je posterai une réponse expliquant!
Voici le DE TRAVAIL Code:
//c++11
#include <iostream>
#include <fstream>
#include <cmath>
#include <string>
#include <sstream>
using std::cout;
using std::string;
int main(){
string nmbr;
{
std::ifstream in("ech.in");
in >> nmbr;
}
enum Equality{
uneven, even, equal
};
Equality eq = uneven;
int amount;
{
short int evn = 0;
short int unevn = 0;
for(unsigned int x = 0;x < nmbr.size();x++){
if(eq == even){
evn += (nmbr[x] - '0');
eq = uneven;
}else{
unevn += (nmbr[x] - '0');
eq = even;
}
}
amount = evn - unevn;
if(amount < 0){
amount = amount * -1;
}
if(evn == unevn){
eq = equal;
}else if(evn > unevn){
eq = uneven;
}else{
eq = even;
}
}
if(eq == equal){
int i;
for(i = nmbr.size() - 1;i >= -1;i--){
if(i < 0){
nmbr = "1" + nmbr;
break;
}
if(nmbr[i] != '9'){
nmbr[i] = std::to_string((nmbr[i] - '0') + 1)[0];
break;
}else{
nmbr[i] = '0';
}
}
int sum = 0;
int sum1 = 0;
for(int x = nmbr.size() - 1;x >= 0;x -= 2){
sum += (nmbr[x] - '0');
}
for(int x = nmbr.size() - 2;x >= 0;x -= 2){
sum1 += (nmbr[x] - '0');
}
bool diff = true;
int diff1 = sum - sum1;
if(diff1 < 0){
diff1 *= -1;
diff = false;
}
if(diff1 == 0){
goto output;
}else{
i = nmbr.size() - 1;
if(diff)i--;
for(;i >= -2;i -= 2){
if(i == -1){
std::stringstream ss;
ss << diff1 << nmbr;
nmbr = ss.str();
}else if(i == -2){
std::stringstream ss;
ss << diff1 * 10;
ss << nmbr;
nmbr = ss.str();
}
int add = 9 - (nmbr[i] - '0');
if(add < diff1){
diff1 -= add;
nmbr[i] = '9';
}else{
nmbr[i] = std::to_string((nmbr[i] - '0') + diff1)[0];
break;
}
}
}
}else{
int i;
{
bool b = (nmbr.size() % 2) == 0;
if(eq == uneven){
if(b)
i = nmbr.size() - 2;
else
i = nmbr.size() - 1;
}else{
if(b)
i = nmbr.size() - 1;
else
i = nmbr.size() - 2;
}
}
for(;i >= -1;i -= 2){
if(i < 0){
for(int pow = 0;true;pow += 2){
if(amount > 9){
amount -= 9;
nmbr = std::to_string(9 * std::pow(1, pow)) + nmbr;
}else{
nmbr = std::to_string(amount * std::pow(1, pow));
break;
}
}
break;
}
int add = 9 - (nmbr[i] - '0');
if(add > amount){
amount -= add;
nmbr[i] = '9';
}else{
nmbr[i] = std::to_string(amount + (nmbr[i] - '0'))[0];
break;
}
}
}
output: std::ofstream out("ech.out");
out << nmbr;
return 0;
}
Voici le code cassé d'origine:
//c++11
#include <iostream>
#include <fstream>
#include <cmath>
#include <string>
#include <sstream>
using std::cout;
using std::string;
int main(){
string nmbr;
{
std::ifstream in("ech.in");
in >> nmbr;
}
short int size = nmbr.size();
enum Equality{
uneven, even, equal
};
Equality eq = uneven;
int amount;
{
short int evn = 0;
short int unevn = 0;
for(int x = 0;x < size;x++){
if(eq == even){
evn += (nmbr[x] - '0');
eq = uneven;
}else{
unevn += (nmbr[x] - '0');
eq = even;
}
}
amount = evn - unevn;
if(amount < 0){
amount = amount * -1;
}
if(evn == unevn){
eq = equal;
}else if(evn > unevn){
eq = uneven;
}else{
eq = even;
}
}
if(eq == equal){
int i;
for(i = size - 1;true;i--){
if(i < 0){
string one = "1";
nmbr = one.append(nmbr);
break;
}
if(nmbr[i] != '9'){
nmbr[i]++;
break;
}else{
nmbr[i] = '0';
}
}
int sum = 0;
int sum1 = 0;
for(int x = size - 1;x >= 0;x -= 2){
sum += (nmbr[x] - '0');
}
for(int x = size - 2;x >= 0;x -= 2){
sum1 += (nmbr[x] - '0');
}
bool diff = true;
int diff1 = sum - sum1;
if(diff1 < 0){
diff1 *= -1;
diff = false;
}
nmbr.append(", __last");
if(diff1 == 0){
goto output;
}else{
i = size - 1 - diff;
for(;true;i -= 2){
cout<<nmbr;
if(i == -1){
std::stringstream ss;
ss << diff1 << nmbr;
nmbr = ss.str();
}else{
std::stringstream ss;
ss << diff1 * 10;
ss << nmbr;
nmbr = ss.str();
}
int add = 9 - (nmbr[i] - '0');
if(add > diff1){
diff1 -= add;
nmbr[i] = '9';
}else{
nmbr[i] = std::to_string((nmbr[i] - '0') + diff1)[0];
break;
}
}
}
}else{
int i;
{
bool b = (nmbr.size() % 2) == 0;
if(eq == uneven){
if(b)
i = nmbr.size() - 2;
else
i = nmbr.size() - 1;
}else{
if(b)
i = nmbr.size() - 1;
else
i = nmbr.size() - 2;
}
}
for(;true;i -= 2){
if(i < 0){
for(int pow = 0;true;pow += 2){
if(amount > 9){
amount -= 9;
nmbr = std::to_string(9 * std::pow(1, pow)) + nmbr;
}else{
nmbr = std::to_string(amount * std::pow(1, pow));
break;
}
}
break;
}
int add = 9 - (nmbr[i] - '0');
if(add > amount){
amount -= add;
nmbr[i] = '9';
}else{
nmbr[i] = std::to_string(amount + (nmbr[i] - '0'))[0];
break;
}
}
}
output: std::ofstream out("ech.out");
out << nmbr;
return 0;
}
Où est le code? – user6556709
Ce que vous nous demandez n'est pas clair, alors je dis simplement oui. – DuKes0mE
@ user6556709 Désolé, j'ai oublié ça, je vais télécharger le maintenant. – theo2003