为什么这段代码无论输入什么都会打印0?

问题描述 投票:0回答:1
#include <iostream>
#include <string>
using namespace std ;
int main() {
    int t ;
    cin >> t ;
    int range ;
    cin >> range ;
    int counter = 0 ;
    while ( t-- ) {
        int j = 0 ;
        string num ; 
        cin >> num ;
        for ( char i : num ) { 
            int val = i - '0' ;
            if ( val > range || val < 0 ) {
                break ;
            }
            else { 
                j++ ;
                if ( j == num.size()+1 ) { 
                    counter++ ;
                    break ;
                }
            }
        }
    }
    cout << counter ;
}

当输入为

10 6
1234560
1234560
1234560
1234560
1234560
1234560
1234560
1234560
1234560
1234560

我期望在输出中找到 10,因为每个字符串都由 0 到 6 的数字组成

range
但输出是 0

代码的主要目标是打印好数字的数量 如果一个数字至少包含一次从 0 到

range
的数字,则该数字被称为好数字。

c++ string
1个回答
0
投票

num.size()
将返回字符串中的字节数,请参阅https://cplusplus.com/reference/string/string/size/

阅读此内容:

请注意,字符串对象在不知道最终可能用于对其包含的字符进行编码的编码的情况下处理字节。因此,返回的值可能与多字节或可变长度字符序列(例如UTF-8)中的实际编码字符数不对应。

所以,我们假设 1 <= ch is the number of bytes used up by each character. Therefore, if you have n characters in

num
,那么
num.size()
实际上就是 ch * n。例如,如果 ch > 1,即 4,那么您的算法预计会增加
j
4 * n,而
j
最多只能增加 n 倍。另外,在您的情况下,字符串的长度并不是计数匹配的良好对应,请考虑

12345601234560

其中字符数为 14,而您希望它为 7。

最后,您需要确保范围内的每个字符至少出现一次,以避免将 1111111111 等数字视为有效匹配。

因此,创建一个 C++ 集合非常有意义 https://cplusplus.com/reference/set/set/,因此当您循环角色时,在每一步检查它是否在集合中,如果不在集合中,添加它。如果集合增加,请将其大小与

range + 1
进行比较,如果达到该水平,则增加
counter

© www.soinside.com 2019 - 2024. All rights reserved.