找到最大值在数字上的位置
Find the position of a max on a number
我有一个 C 程序需要找到一个数字的位置。它是这样的:
我们从标准输入中输入未知数量的正数。这些数字最多有 5 位数字,我们读取新数字直到用户输入一个不是数字的值。我需要从右到左找到数字的最大数字的位置。如果最大数字的实例不止一个,则使用最右边的位置。
程序需要输出位置和在该位置找到一个数的最大位的次数。
例如:
输入:
97654 48654 12345 12343 1263 12443 12643 12777 #
输出:
0: 2
1: 3
2: 1
3: 1
4: 1
因为
Position: 4 3 0 1 1 1 2 0
v v v v v v v v
97654 48654 12345 12343 1263 12443 12643 12777 #
程序适用于这个特定的测试用例
更多测试用例在代码下
这是我的代码:
#include <stdio.h>
int main(){
int n;
int max;
int num,digit,pos,br0=0,br1=0,br2=0,br3=0,br4=0;
while (scanf("%d",&n)) {
max =0;
num = n;
pos=0;
while (num>0) {
digit = num%10;
if(digit > max){
max=digit;
pos++;
}
num/=10;
}
printf("%d\n",pos);
switch (pos) {
case 1: br0++; break;
case 2: br1++; break;
case 3: br2++; break;
case 4: br3++; break;
case 5: br4++; break;
}
}
printf("0: %d\n1: %d\n2: %d\n3: %d\n4: %d\n",br0,br1,br2,br3,br4);
return 0;
}
此程序适用于某些测试用例,例如
97654 48654 12345 12343 1263 12443 12643 12777 #
123 456 789 987 654 321 #
但不适用于:
542 8965 7452 1111 12 8 6532 98745 15926 #
75386 86142 94285 15926 35724 #
使用 fgets()
并保持输入为 string 格式的工作可能会减少步骤。 (验证它是否包含数字字符。)
另外,一组值将更容易保持价值链以索引关系。
这是获取您描述的信息的另一种方法:
int main(void) {
char inBuf[20] = {0};
int index = 0;
int loops = 0;
int maxPos = 0;
int maxVal = 0;
printf("Enter a number : ");
while (fgets(inBuf, sizeof inBuf, stdin) && loops < 6) {
inBuf[strcspn(inBuf, "\r\n")] = 0;//remove unwanted white space
if(strstr(inBuf, "#")) return 0;//exit if "#"
if(digits_only(inBuf))
{
index = 0;
maxVal = inBuf[index];
while(inBuf[index])
{
if(inBuf[index] >= maxVal)
{
maxVal = inBuf[index];
maxPos = index;
}
index++;
}
printf("%d:%d \n", loops, maxPos);
loops++;
inBuf[0]=0;
}
else
{
printf("\n%s contains non-numeric characters, it cannot be converted.\n\nctrl-c to exit\n...Or enter a number : \n", inBuf);
}
};
return 0;
}
你的程序的问题是在这个循环中
while (num>0) {
digit = num%10;
if(digit > max){
max=digit;
pos++;
}
num/=10;
}
变量pos
仅在找到大于先前数字的数字时递增。例如如果你有这样的号码
51234
那么第一个最大的数字是4
并且变量pos
设置为1
。之后,当找到下一个最大的数字 5
时,变量 pos
递增并变得等于 2
而实际上最大的数字 5
位于该位置5
.
你需要多引入一个变量作为例子
max =0;
num = n;
pos=1;
int i = 1;
do
{
digit = num%10;
if(digit > max){
max=digit;
pos = i;
}
} while ( ( num /=10 ) && ( i++ != 5 ) );
我会这样写程序
#include <stdio.h>
int main(void)
{
enum { N = 5 };
const unsigned int Base = 10;
size_t total[N] = { 0 };
unsigned int n;
while ( scanf( "%u", &n ) == 1 )
{
unsigned int pos = 0;
unsigned int max_digit = 0;
unsigned int i = 0;
do
{
unsigned int current_digit = n % Base;
if ( max_digit < current_digit )
{
pos = i;
max_digit = current_digit;
}
} while ( ( n /= Base ) && ( ++i != N ) );
++total[pos];
}
for ( unsigned int i = 0; i < N; i++ )
{
printf( "%u: %zu\n", i, total[i] );
}
return 0;
}
为输入
542 8965 7452 1111 12 8 6532 98745 15926 #
程序输出为
0: 3
1: 0
2: 3
3: 2
4: 1
scanf
是错误的工具。 (scanf
是(几乎)总是错误的工具)。对于这个特定问题,您确实希望将输入视为字符串。只要你不想接受看起来像“1e3”的输入(这是一个完全有效的整数表示),你就可以做这样的事情:
#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include <string.h>
int
main(void){
int max = -1;
int br[5] = {0};
int maxpos = -1;
int len = 0;
int c;
while( (c = getchar()) != EOF ){
if( c && strchr("0123456789", c) ){
if( ++len > 5 ){
fputs("invalid input\n", stderr);
return 1;
}
assert( len > 0 && len < 6 );
if( c > max + '0' ){
maxpos = len;
max = c - '0';
}
} else if( isspace(c) ){
if( max > -1 ){
br[len - maxpos] += 1;
}
maxpos = -1;
len = 0;
max = '0' - 1;
} else {
fputs("invalid input\n", stderr);
return 1;
}
}
for( int i = 0; i < 5; i++ ){
printf("%d: %d\n", i, br[i]);
}
return 0;
}
我有一个 C 程序需要找到一个数字的位置。它是这样的:
我们从标准输入中输入未知数量的正数。这些数字最多有 5 位数字,我们读取新数字直到用户输入一个不是数字的值。我需要从右到左找到数字的最大数字的位置。如果最大数字的实例不止一个,则使用最右边的位置。
程序需要输出位置和在该位置找到一个数的最大位的次数。
例如:
输入:
97654 48654 12345 12343 1263 12443 12643 12777 #
输出:
0: 2
1: 3
2: 1
3: 1
4: 1
因为
Position: 4 3 0 1 1 1 2 0
v v v v v v v v
97654 48654 12345 12343 1263 12443 12643 12777 #
程序适用于这个特定的测试用例
更多测试用例在代码下
这是我的代码:
#include <stdio.h>
int main(){
int n;
int max;
int num,digit,pos,br0=0,br1=0,br2=0,br3=0,br4=0;
while (scanf("%d",&n)) {
max =0;
num = n;
pos=0;
while (num>0) {
digit = num%10;
if(digit > max){
max=digit;
pos++;
}
num/=10;
}
printf("%d\n",pos);
switch (pos) {
case 1: br0++; break;
case 2: br1++; break;
case 3: br2++; break;
case 4: br3++; break;
case 5: br4++; break;
}
}
printf("0: %d\n1: %d\n2: %d\n3: %d\n4: %d\n",br0,br1,br2,br3,br4);
return 0;
}
此程序适用于某些测试用例,例如
97654 48654 12345 12343 1263 12443 12643 12777 #
123 456 789 987 654 321 #
但不适用于:
542 8965 7452 1111 12 8 6532 98745 15926 #
75386 86142 94285 15926 35724 #
使用 fgets()
并保持输入为 string 格式的工作可能会减少步骤。 (验证它是否包含数字字符。)
另外,一组值将更容易保持价值链以索引关系。
这是获取您描述的信息的另一种方法:
int main(void) {
char inBuf[20] = {0};
int index = 0;
int loops = 0;
int maxPos = 0;
int maxVal = 0;
printf("Enter a number : ");
while (fgets(inBuf, sizeof inBuf, stdin) && loops < 6) {
inBuf[strcspn(inBuf, "\r\n")] = 0;//remove unwanted white space
if(strstr(inBuf, "#")) return 0;//exit if "#"
if(digits_only(inBuf))
{
index = 0;
maxVal = inBuf[index];
while(inBuf[index])
{
if(inBuf[index] >= maxVal)
{
maxVal = inBuf[index];
maxPos = index;
}
index++;
}
printf("%d:%d \n", loops, maxPos);
loops++;
inBuf[0]=0;
}
else
{
printf("\n%s contains non-numeric characters, it cannot be converted.\n\nctrl-c to exit\n...Or enter a number : \n", inBuf);
}
};
return 0;
}
你的程序的问题是在这个循环中
while (num>0) {
digit = num%10;
if(digit > max){
max=digit;
pos++;
}
num/=10;
}
变量pos
仅在找到大于先前数字的数字时递增。例如如果你有这样的号码
51234
那么第一个最大的数字是4
并且变量pos
设置为1
。之后,当找到下一个最大的数字 5
时,变量 pos
递增并变得等于 2
而实际上最大的数字 5
位于该位置5
.
你需要多引入一个变量作为例子
max =0;
num = n;
pos=1;
int i = 1;
do
{
digit = num%10;
if(digit > max){
max=digit;
pos = i;
}
} while ( ( num /=10 ) && ( i++ != 5 ) );
我会这样写程序
#include <stdio.h>
int main(void)
{
enum { N = 5 };
const unsigned int Base = 10;
size_t total[N] = { 0 };
unsigned int n;
while ( scanf( "%u", &n ) == 1 )
{
unsigned int pos = 0;
unsigned int max_digit = 0;
unsigned int i = 0;
do
{
unsigned int current_digit = n % Base;
if ( max_digit < current_digit )
{
pos = i;
max_digit = current_digit;
}
} while ( ( n /= Base ) && ( ++i != N ) );
++total[pos];
}
for ( unsigned int i = 0; i < N; i++ )
{
printf( "%u: %zu\n", i, total[i] );
}
return 0;
}
为输入
542 8965 7452 1111 12 8 6532 98745 15926 #
程序输出为
0: 3
1: 0
2: 3
3: 2
4: 1
scanf
是错误的工具。 (scanf
是(几乎)总是错误的工具)。对于这个特定问题,您确实希望将输入视为字符串。只要你不想接受看起来像“1e3”的输入(这是一个完全有效的整数表示),你就可以做这样的事情:
#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include <string.h>
int
main(void){
int max = -1;
int br[5] = {0};
int maxpos = -1;
int len = 0;
int c;
while( (c = getchar()) != EOF ){
if( c && strchr("0123456789", c) ){
if( ++len > 5 ){
fputs("invalid input\n", stderr);
return 1;
}
assert( len > 0 && len < 6 );
if( c > max + '0' ){
maxpos = len;
max = c - '0';
}
} else if( isspace(c) ){
if( max > -1 ){
br[len - maxpos] += 1;
}
maxpos = -1;
len = 0;
max = '0' - 1;
} else {
fputs("invalid input\n", stderr);
return 1;
}
}
for( int i = 0; i < 5; i++ ){
printf("%d: %d\n", i, br[i]);
}
return 0;
}