我只是通过HackerRanks练习我的C ++,而且我正在解决这个问题:
问题陈述
您将获得一个整数N.找到此数字中的数字 准确地划分N(除以0作为余数的除法)并显示 他们的数量。对于N = 24,有2位数 - 2&这两个 数字完全除以24.所以我们的答案是2。
注意
如果相同的数字在不同的位置重复两次,它应该 被计数两次,例如,对于N = 122,2精确地划分122并且出现在 那些'和数十'位置。所以对于这种情况,我们的答案是3.分部 0是未定义的。输入格式
第一行包含T(测试用例数),后跟T行 (每个都包含一个整数N)。
约束1≤T≤150
这是我的计划:
1 #include <cmath>
2 #include <string>
3 #include <iostream>
4 #include <cstdlib>
5 using namespace std;
6 void checkDigits(string);
7 int main (){
8 string val;
9 int count = 0, i;
10
11 cin >> i;
12 for (int j = 1; j <= i; j++){
13 cin >> val;
14 checkDigits(val);
15 }
16 return 0;
17 }
18
19 void checkDigits(string s){
20 int len, count = 0;
21 int full, digit;
22
23 len = s.length();
24 for(int i = 0; i < len; i++){
25 full = stoi(s);
26 digit = stoi(s[i]);
27 if(full % digit == 0)
28 count++;
29 }
30 cout << count;
31 }
什么会导致我的编译器给我这个错误?
hackerrank2.cpp:在函数'void checkDigits(std :: string)'中: hackerrank2.cpp:26:20:错误:调用重载'stoi(char&amp;)'是 模糊的数字= stoi(s [i]); ^ hackerrank2.cpp:26:20:注意:候选人是:在/usr/include/c++/4.8/string:52:0中包含的文件中, 来自hackerrank2.cpp:2:/usr/include/c++/4.8/bits/basic_string.h:2823:3:注意:int std :: stoi(const string&amp;,std :: size_t *,int)stoi(const 串和放大器; __str,size_t * __idx = 0,int __base = 10)^ /usr/include/c++/4.8/bits/basic_string.h:2823:3:注意:不知道 将参数1从'char'转换为'const string&amp; {aka const 性病:: basic_string的&放大器;}” /usr/include/c++/4.8/bits/basic_string.h:2926:3:注意:int std :: stoi(const wstring&amp;,std :: size_t *,int)
stoi(const wstring&amp; __str,size_t * __idx = 0,int __base = 10)^ /usr/include/c++/4.8/bits/basic_string.h:2926:3:注意:不知道 将参数1从'char'转换为'const wstring&amp; {aka const 的std :: basic_string的&安培;}”
答案 0 :(得分:5)
std::stoi()
适用于字符串,而非字符;没有std::stoi()
的重载接受char
,这就是编译器告诉你的。 (请注意,列出的原型将const std::string &
和const std::wstring &
作为它们各自的第一个参数。char &
不能隐式转换为其中任何一个,因此编译器无法选择它应该使用哪个重载因为两者都不起作用。)
如果您知道该字符是数字,那么您可以使用这个简单的函数:
inline int ctoi(char c)
{
return c - '0';
}
(或者只是内联:digit = s[i] - '0';
)