C ++ - 计算一系列数字的数字
C++ - Counting digits of a range of numbers
我需要做的事情:
用户输入从 S 到 K 范围内的数字的程序。它应该计算一个数字在数字中被找到的次数,最后按以下顺序打印出来:0 1 2 3 4 5 6 7 8 9.
我的代码:
OBS:它不适用于超过 10 的数字。
#include <iostream>
using namespace std;
int main()
{
int S, K;
cin >> S >> K;
int digits = 0;
int dig0 = 0;
int dig1 = 0;
int dig2 = 0;
int dig3 = 0;
int dig4 = 0;
int dig5 = 0;
int dig6 = 0;
int dig7 = 0;
int dig8 = 0;
int dig9 = 0;
int remainder = 0;
for (int i = S; i <= K; i++) {
if (i < 10) {
switch(i) {
case 0:
dig0++;
break;
case 1:
dig1++;
break;
case 2:
dig2++;
break;
case 3:
dig3++;
break;
case 4:
dig4++;
break;
case 5:
dig5++;
break;
case 6:
dig6++;
break;
case 7:
dig7++;
break;
case 8:
dig8++;
break;
case 9:
dig9++;
break;
}
} else if (i >= 10) {
while (i > 0) {
remainder = i % 10;
switch(remainder) {
case 0:
dig0++;
break;
case 1:
dig1++;
break;
case 2:
dig2++;
break;
case 3:
dig3++;
break;
case 4:
dig4++;
break;
case 5:
dig5++;
break;
case 6:
dig6++;
break;
case 7:
dig7++;
break;
case 8:
dig8++;
break;
case 9:
dig9++;
break;
}
i /= 10;
}
}
}
cout << dig0 << ' ' << dig1 << ' ' << dig2
<< ' ' << dig3 << ' ' << dig4 << ' ' << dig5
<< ' ' << dig6 << ' ' << dig7 << ' ' << dig8 << ' ' << dig9;
return 0;
}
期望的行为:
Test case 01
Input: 1 to 9
Output: 0 1 1 1 1 1 1 1 1 1 (Since there are 0 digits
of 0, and 1 digit of each number from 1 to 9)
Test case 02
Input: 767 772
Output: 1 1 1 0 0 0 3 10 1 1
(编辑以允许 S 和 K 的任何值,包括负数)
可以
#include <iostream>
using namespace std;
int main()
{
int S, K;
int dig[10] = { 0 };
if (!(cin >> S >> K))
return -1;
if (S > K)
swap(S, K);
for (auto i = S; i <= K; ++i) {
auto v = i;
do {
dig[abs(v % 10)] += 1;
v /= 10;
} while (v != 0);
}
for (auto v : dig)
cout << v << ' ';
cout << endl;
return 0;
}
我对你的提议做了一些修改
- 更正是让i在内部不变,而使用其他变量。
- 我检查输入了两个有效值 (
if (!(cin >> S >> K)) ...
)
- 如果需要,我交换 S 和 K 以使 S <= K,因为这是下面 for 中的假设
- 我使用数组而不是 dig0 dig1 ... dig9,使用数组更简单
- 我管理负值。请注意,我使用
int v = i; ... dig[abs(v % 10)] += 1;
而不是 int v = abs(i); ... dig[v % 10] += 1;
来管理 v 为 INT_MIN
的情况( -INT_MIN
等于 INT_MIN
因此在使用 2 的补码时仍然为负)
编译与执行:
pi@raspberrypi:/tmp $ g++ -pedantic -Wextra m.cc
pi@raspberrypi:/tmp $ ./a.out
1 9
0 1 1 1 1 1 1 1 1 1
pi@raspberrypi:/tmp $ ./a.out
767 772
1 1 1 0 0 0 3 10 1 1
pi@raspberrypi:/tmp $ ./a.out
-1 1
1 2 0 0 0 0 0 0 0 0
pi@raspberrypi:/tmp $ ./a.out
-767 -772
1 1 1 0 0 0 3 10 1 1
补充说明:如果 auto 打扰您将它们替换为 int,将 for (auto v : dig) cout << v << ' ';
替换为 for (int i = 0; i != 10; ++i) cout << dig[i] << ' ';
switch语句的使用比较笨拙,可以将多个int变量合并到一个数组中。
#include <array>
#include <iostream>
int main() {
std::array<int, 10> digits = {0};
int s, k;
std::cin >> s >> k;
int temp;
if(s > k) {//swap s and k, if s > k
temp = s;
s = k;
k = temp;
}
for(s; s <= k; s++) {
temp = s;
do {
digits[temp%10]++;
temp /= 10;
}while(temp != 0);
}
for(int j : digits) {
std::cout << ' ' << j;
}
return 0;
}
我需要做的事情:
用户输入从 S 到 K 范围内的数字的程序。它应该计算一个数字在数字中被找到的次数,最后按以下顺序打印出来:0 1 2 3 4 5 6 7 8 9.
我的代码:
OBS:它不适用于超过 10 的数字。
#include <iostream>
using namespace std;
int main()
{
int S, K;
cin >> S >> K;
int digits = 0;
int dig0 = 0;
int dig1 = 0;
int dig2 = 0;
int dig3 = 0;
int dig4 = 0;
int dig5 = 0;
int dig6 = 0;
int dig7 = 0;
int dig8 = 0;
int dig9 = 0;
int remainder = 0;
for (int i = S; i <= K; i++) {
if (i < 10) {
switch(i) {
case 0:
dig0++;
break;
case 1:
dig1++;
break;
case 2:
dig2++;
break;
case 3:
dig3++;
break;
case 4:
dig4++;
break;
case 5:
dig5++;
break;
case 6:
dig6++;
break;
case 7:
dig7++;
break;
case 8:
dig8++;
break;
case 9:
dig9++;
break;
}
} else if (i >= 10) {
while (i > 0) {
remainder = i % 10;
switch(remainder) {
case 0:
dig0++;
break;
case 1:
dig1++;
break;
case 2:
dig2++;
break;
case 3:
dig3++;
break;
case 4:
dig4++;
break;
case 5:
dig5++;
break;
case 6:
dig6++;
break;
case 7:
dig7++;
break;
case 8:
dig8++;
break;
case 9:
dig9++;
break;
}
i /= 10;
}
}
}
cout << dig0 << ' ' << dig1 << ' ' << dig2
<< ' ' << dig3 << ' ' << dig4 << ' ' << dig5
<< ' ' << dig6 << ' ' << dig7 << ' ' << dig8 << ' ' << dig9;
return 0;
}
期望的行为:
Test case 01
Input: 1 to 9
Output: 0 1 1 1 1 1 1 1 1 1 (Since there are 0 digits of 0, and 1 digit of each number from 1 to 9)
Test case 02
Input: 767 772
Output: 1 1 1 0 0 0 3 10 1 1
(编辑以允许 S 和 K 的任何值,包括负数)
可以
#include <iostream>
using namespace std;
int main()
{
int S, K;
int dig[10] = { 0 };
if (!(cin >> S >> K))
return -1;
if (S > K)
swap(S, K);
for (auto i = S; i <= K; ++i) {
auto v = i;
do {
dig[abs(v % 10)] += 1;
v /= 10;
} while (v != 0);
}
for (auto v : dig)
cout << v << ' ';
cout << endl;
return 0;
}
我对你的提议做了一些修改
- 更正是让i在内部不变,而使用其他变量。
- 我检查输入了两个有效值 (
if (!(cin >> S >> K)) ...
) - 如果需要,我交换 S 和 K 以使 S <= K,因为这是下面 for 中的假设
- 我使用数组而不是 dig0 dig1 ... dig9,使用数组更简单
- 我管理负值。请注意,我使用
int v = i; ... dig[abs(v % 10)] += 1;
而不是int v = abs(i); ... dig[v % 10] += 1;
来管理 v 为INT_MIN
的情况(-INT_MIN
等于INT_MIN
因此在使用 2 的补码时仍然为负)
编译与执行:
pi@raspberrypi:/tmp $ g++ -pedantic -Wextra m.cc
pi@raspberrypi:/tmp $ ./a.out
1 9
0 1 1 1 1 1 1 1 1 1
pi@raspberrypi:/tmp $ ./a.out
767 772
1 1 1 0 0 0 3 10 1 1
pi@raspberrypi:/tmp $ ./a.out
-1 1
1 2 0 0 0 0 0 0 0 0
pi@raspberrypi:/tmp $ ./a.out
-767 -772
1 1 1 0 0 0 3 10 1 1
补充说明:如果 auto 打扰您将它们替换为 int,将 for (auto v : dig) cout << v << ' ';
替换为 for (int i = 0; i != 10; ++i) cout << dig[i] << ' ';
switch语句的使用比较笨拙,可以将多个int变量合并到一个数组中。
#include <array>
#include <iostream>
int main() {
std::array<int, 10> digits = {0};
int s, k;
std::cin >> s >> k;
int temp;
if(s > k) {//swap s and k, if s > k
temp = s;
s = k;
k = temp;
}
for(s; s <= k; s++) {
temp = s;
do {
digits[temp%10]++;
temp /= 10;
}while(temp != 0);
}
for(int j : digits) {
std::cout << ' ' << j;
}
return 0;
}