C中的数字频率计算代码不起作用
Digit Frequency calculating code in C not working
所以,我正在编写这段代码来计算数字频率,即 0-9 数字在用户输入的字符串(字母数字)中出现的次数。因此,我将字符串转换为整数并尝试将频率存储在“计数”中并打印出来,但是当我 运行 代码时,计数永远不会增加,输出全为 0。如果有人指出我的逻辑哪里有问题,将不胜感激。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main() {
// takes string input
char *s;
s = malloc(1024 * sizeof(char));
scanf("%[^\n]", s);
s = realloc(s, strlen(s) + 1);
//turns the string to int
int x = atoi(s);
int temp = x, len = 0;
//calculates string length
while (x != 0) {
x = x / 10;
len++;
}
x = temp;
//parses through the string and matches digits with each number
for (int j = 0; j < 10; j++){
int count = 0;
for(int i = 0; i < len; i++){
if(x % 10 == j){
count++;
}
x = x / 10;
}
x = temp;
printf("%d ", count);
}
return 0;
}
你的方法对于一个非常简单的任务来说太复杂了。这将做到:
void numberOfDigits(const char *s, int hist[10]) {
while(*s) {
if(isdigit(*s))
hist[*s - '0']++;
s++;
}
}
可以这样使用:
int main(void) {
char buf[1024];
int hist[10];
fgets(buf, sizeof buf, stdin);
numberOfDigits(s, hist);
for(int i=0; i<10; i++)
printf("Digit %d occurs %d times\n", i, hist[i]);
}
如果需要,这也可以在没有缓冲区的情况下很容易地实现:
int ch;
int hist[10];
while((ch = getchar()) != EOF) {
if(isdigit(ch))
hist[ch - '0']++;
}
编写一个正确合理的数数程序:
- 不要为此分配任何缓冲区。
- 创建一个数组来计算每个数字出现的次数。该数组应该有十个元素,每个数字一个。
- 将数组的每个元素初始化为零。
- 在循环中,一次读取一个字符。
- 当读取例程(例如
getchar
)指示文件结束或出现问题时离开循环,或者,如果需要,returns 换行符或您希望的其他字符用作输入结束指示。
- 在循环内部,检查读取的字符是否为数字。如果读入的字符是数字,则将数组对应的元素递增。
- 循环后,执行一个新的循环来遍历数字。
- 在该循环内,对于每个数字,打印该数字的数组元素的计数。
#include <stdio.h>
int main(void) {
int input = 1223330;
int freq[10] = {0};
input = abs(input);
while(input)
{
freq[input%10]++;
input /= 10;
}
for(int i=0; i<10; ++i)
{
printf("%d: %.*s\n", i, freq[i], "*************************************************");
}
return 0;
}
输出:
Success #stdin #stdout 0s 5668KB
0: *
1: *
2: **
3: ***
4:
5:
6:
7:
8:
9:
此应用目前受到 int
大小的限制(大约 9 或 10 位数字)。
您可以更新它以轻松使用 long long
,这将使您达到大约 19 位数字。
所以,我正在编写这段代码来计算数字频率,即 0-9 数字在用户输入的字符串(字母数字)中出现的次数。因此,我将字符串转换为整数并尝试将频率存储在“计数”中并打印出来,但是当我 运行 代码时,计数永远不会增加,输出全为 0。如果有人指出我的逻辑哪里有问题,将不胜感激。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main() {
// takes string input
char *s;
s = malloc(1024 * sizeof(char));
scanf("%[^\n]", s);
s = realloc(s, strlen(s) + 1);
//turns the string to int
int x = atoi(s);
int temp = x, len = 0;
//calculates string length
while (x != 0) {
x = x / 10;
len++;
}
x = temp;
//parses through the string and matches digits with each number
for (int j = 0; j < 10; j++){
int count = 0;
for(int i = 0; i < len; i++){
if(x % 10 == j){
count++;
}
x = x / 10;
}
x = temp;
printf("%d ", count);
}
return 0;
}
你的方法对于一个非常简单的任务来说太复杂了。这将做到:
void numberOfDigits(const char *s, int hist[10]) {
while(*s) {
if(isdigit(*s))
hist[*s - '0']++;
s++;
}
}
可以这样使用:
int main(void) {
char buf[1024];
int hist[10];
fgets(buf, sizeof buf, stdin);
numberOfDigits(s, hist);
for(int i=0; i<10; i++)
printf("Digit %d occurs %d times\n", i, hist[i]);
}
如果需要,这也可以在没有缓冲区的情况下很容易地实现:
int ch;
int hist[10];
while((ch = getchar()) != EOF) {
if(isdigit(ch))
hist[ch - '0']++;
}
编写一个正确合理的数数程序:
- 不要为此分配任何缓冲区。
- 创建一个数组来计算每个数字出现的次数。该数组应该有十个元素,每个数字一个。
- 将数组的每个元素初始化为零。
- 在循环中,一次读取一个字符。
- 当读取例程(例如
getchar
)指示文件结束或出现问题时离开循环,或者,如果需要,returns 换行符或您希望的其他字符用作输入结束指示。 - 在循环内部,检查读取的字符是否为数字。如果读入的字符是数字,则将数组对应的元素递增。
- 循环后,执行一个新的循环来遍历数字。
- 在该循环内,对于每个数字,打印该数字的数组元素的计数。
#include <stdio.h>
int main(void) {
int input = 1223330;
int freq[10] = {0};
input = abs(input);
while(input)
{
freq[input%10]++;
input /= 10;
}
for(int i=0; i<10; ++i)
{
printf("%d: %.*s\n", i, freq[i], "*************************************************");
}
return 0;
}
输出:
Success #stdin #stdout 0s 5668KB
0: *
1: *
2: **
3: ***
4:
5:
6:
7:
8:
9:
此应用目前受到 int
大小的限制(大约 9 或 10 位数字)。
您可以更新它以轻松使用 long long
,这将使您达到大约 19 位数字。