gpt4 book ai didi

c++ - 求和 atoi 的输出

转载 作者:太空宇宙 更新时间:2023-11-03 10:23:59 25 4
gpt4 key购买 nike

我正在尝试学习 C++14(具有“现代”/非 C 风格)。我正在尝试对字符串中的数字求和,对于等于下一个数字(或第一个数字,如果在字符串的末尾)的数字。我用 Python 解决了它,但在 C++14 中,我得到了意外的输出。

ma​​in.cpp:

#include <iostream>
#include <stdlib.h>

using namespace std;

using sum_t = uint64_t; // int; // unsigned long long;

// sum_digits sums the digits in the given std::string and returns an integer of type sum_t
sum_t sum_digits(std::string digits) {
sum_t total = 0;
for (const auto &digit : digits) {
total += atoi(new char(digit));
cout << "sum this far: " << total << endl;
}
return total;
}

// return the last char
// returns ' ' if given an empty string
char last(std::string digits) {
auto dl = digits.length();
if (dl < 1) {
return ' ';
}
return digits.at(dl - 1);
}

// sum_equal_digits returns a sum of the digits that are equal to the next one
sum_t sum_equal_digits(std::string digits) {
auto equal_digits = ""s; // a list of equal digits, as std::string
auto prev_digit = last(digits); // start with the last digit, since the digit list is supposed to be circular
for (const auto &digit : digits) {
if (digit == prev_digit) {
equal_digits += digit;
}
prev_digit = digit;
}
return sum_digits(equal_digits);
}

void equal(sum_t a, sum_t b) {
if (a == b) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
exit(EXIT_FAILURE);
}
}

int main() {
equal(sum_equal_digits("1122"s), 3);
equal(sum_equal_digits("1111"s), 4);
equal(sum_equal_digits("1234"s), 0);
equal(sum_equal_digits("91212129"s), 9);
equal(sum_equal_digits("823936645345581272695677318513459491834641129844393742672553544439126314399846773234845535593355348931499496184839582118817689171948635864427852215325421433717458975771369522138766248225963242168658975326354785415252974294317138511141826226866364555761117178764543435899886711426319675443679829181257496966219435831621565519667989898725836639626681645821714861443141893427672384716732765884844772433374798185955741311116365899659833634237938878181367317218635539667357364295754744829595842962773524584225427969467467611641591834876769829719248136613147351298534885563144114336211961674392912181735773851634298227454157885241769156811787611897349965331474217223461176896643242975397227859696554492996937235423272549348349528559432214521551656971136859972232854126262349381254424597348874447736545722261957871275935756764184378994167427983811716675476257858556464755677478725146588747147857375293675711575747132471727933773512571368467386151966568598964631331428869762151853634362356935751298121849281442128796517663482391226174256395515166361514442624944181255952124524815268864131969151433888721213595267927325759562132732586252438456569556992685896517565257787464673718221817783929691626876446423134331749327322367571432532857235214364221471769481667118117729326429556357572421333798517168997863151927281418238491791975399357393494751913155219862399959646993428921878798119215675548847845477994836744929918954159722827194721564121532315459611433157384994543332773796862165243183378464731546787498174844781781139571984272235872866886275879944921329959736315296733981313643956576956851762149275521949177991988236529475373595217665112434727744235789852852765675189342753695377219374791548554786671473733124951946779531847479755363363288448281622183736545494372344785112312749694167483996738384351293899149136857728545977442763489799693492319549773328626918874718387697878235744154491677922317518952687439655962477734559232755624943644966227973617788182213621899579391324399386146423427262874437992579573858589183571854577861459758534348533553925167947139351819511798829977371215856637215221838924612644785498936263849489519896548811254628976642391428413984281758771868781714266261781359762798"), 1144);
return 0;
}

输出的最后两行是:

sum this far: 18446744073627459815
NO

但我期待:

sum this far: 1144                                                                                
YES

我用以下代码编译程序:

g++ -O2 -std=c++14 -Wfatal-errors -pedantic -Wall main.cpp -o main

我还尝试了 using sum_t = int;using sum_t = uint64_t;

如何修正程序?

最佳答案

除了 Mr1Penguin 的回答,这对 atoi 是正确的;用

可以避免整个 atoi 的麻烦
sum_t sum_digits(std::string digits) {
sum_t total = 0;
for (const auto &digit : digits)
total += digit - '0'
return total;
}

但它不会对非数字字符提供完全相同的保护。

关于c++ - 求和 atoi 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47651205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com