数字的总和在奇数,甚至是字符串的位置

sum of digits at odd and even places of a string

本文关键字:字符串 位置 数字      更新时间:2023-10-16

变量sum_e的输出为负,这不是我所期望的。

我只是在偶数和奇数位置添加了值,然后将它们存储在两个变量中。我检查了解决方案,并找到了从数字提取数字提取的解决方案。他们都没有字符串输入。

#include<iostream>
using namespace std;
int main(){
    string s;
    cin>>s;
    int sum_e=0,sum_o=0;
    int l=s.length();
    for(int i=0;i<=l;i=i+2){
        sum_o+=(s[i]-'0');
    }
    for(int j=1;j<=l;j=j+2){
        sum_e+=(s[j]-'0');
    }
    cout<<sum_o<<endl<<sum_e;
    return 0;
}

我从字符串索引中减去了" 0",将其转换为int。其中一个变量显示正确的输出,另一个显示一个负数。

您的for循环比数组的长度长一次,因此当i = l时,s[i]将从内存中获得不确定/垃圾值。使用i < lj < l而不是i <= lj <= l,因为C 中的索引开始为零。

#include <iostream>
using namespace std;
int main(){
    string s;
    cin >> s;
    int sum_e = 0, sum_o = 0;
    int l = s.length();
    for(int i = 0; i < l; i = i + 2){
        sum_o += (s[i] - '0');
    }
    for(int j = 1; j < l; j = j + 2){
        sum_e += (s[j] - '0');
    }
    cout << sum_o << endl << sum_e;
    return 0;
}

要改进您的代码,将一个用于循环而不是两个。

for(int i = 0; i < l; i++){
    // Check if even (i%2 returns the remainder of i/2, so here i%2==1 means even)
    if(i%2 == 1){
        sum_e += (s[i] - '0');
    }else{
        sum_o += (s[i] - '0');
    }
}

c 中的数组索引从0开始。您将字符串的 length作为 l存储,因此字符串的元素位于 s[0]s[l-1]。在s[l]处存在一些垃圾值,该垃圾值将添加到您的一个变量之一中,因此产生不希望的结果。

#include<iostream>
using namespace std;
int main(){
    string s;
    cin>>s;
    int sum_e=0,sum_o=0;
    int l=s.length();
    for(int i=0;i<l;i=i+2){ // use <
        sum_o+=(s[i]-'0');
    }
    for(int j=1;j<l;j=j+2){ // use <
        sum_e+=(s[j]-'0');
    }
    cout<<sum_o<<endl<<sum_e;
    return 0;
}

您也可以使用单个循环进行奇数甚至偶数总和。您的代码大小将减少并看起来更好

for(int i=0;i<l;i=i+2){ 
        if(i%2==0)// even index means odd position numbers
             sum_o+=(s[i]-'0');
        else
              sum_e+=(s[j]-'0');
    }