C - 数字中数字的位置
C - Position of digit in a number
void main()
{
int i, j = 0, p, q, N; // N is the integer and p is the position needed
printf("Enter two positive integers: ");
scanf("%d%d", &N, &p); // Taking the values of N and p
for(i = 1; i <= p; i++) {
j = N / 10;
q = j % 10;
i++;
j = q;
}
printf("The digit of %d in the position %d is %d", N, p, j);
}
示例输入:
输入两个正整数:
123456789
3
输出:
The digit of 123456789 in the position 3 is 8
上面的代码行实际上有两个问题:
- 如果我用上面的方法电脑会从右到左开始取数字,而通常情况下,数字的计数是从左到右开始的
- 程序只是在循环中重复自己,这意味着它不会在第二次运行时使用
j
的新值
#include <stdio.h>
int main()
{
int i=0;
int j=0;
int p=5;
int n = 123456;
int digits[12]={};
j=n;
while(j)
{
digits[i]=j%10;
j = j/10;
i++;
}
printf("The digit of %d in the position %d is %d",n,p,digits[i-p]);
return 0;
}
我设计的最简单的方法就是将整数转换为数字并查找。
为什么这样:
避免pow
,log10
因为他们需要浮点支持到运行,硬件浮点到运行快。
并避免两个循环,因为这两个循环会进行大量重复计算。
首先你计算整数的位数,比如n
。然后你可以通过将数字除以10n-1得到第一个数字。然后把它放在一个循环中,减少 n 1 & number N 由
N%=10n-1
int main()
{
int i,j=0,p,N;
printf("Enter two positive integers: ");
scanf("%d%d",&N,&p);
int pow=1,tmp=N;
//counting power of 10 to divide
while(tmp>10)
{
pow*=10;
tmp/=10;
}
tmp=N;
for(i=1; i<=p;i++){
j = tmp/pow;
tmp%=pow;
pow/=10;
}
printf("The digit of %d in the position %d is %d\n",N,p,j);
}
有几种方法可以做到这一点。正如一些评论所建议的那样,您可以执行以下任一操作:
方法一:
将数字转换成字符串数组,可以通过sprintf
.
来完成
char str[256];
int len = sprintf(str,"%d",N);
//traverse str using len
方法二:
由于以 b 为底的 n 位数字 N,您可以表示最多 pow(b,n)-1
的任何数字。要获得数字,您可以使用 pow
的反函数,即以 b 为底的对数。您可能无法获得整数值,因此您可以使用 floor
并将结果转换为 int。完整的程序如下所示:
#include <stdio.h>
#include <math.h>
int getDigit(int num, int p)
{
return (num / (int)pow(10, floor(log10(num)) - p)) % 10;
}
int main()
{
int i,j=0,p,q,N;// N is the integer and p is the position needed
printf("Enter two positive integers: ");
scanf("%d%d",&N,&p);// Taking the values of N and p
j = getDigit(N,p);
//The result is j if you count from 0, j+1 if you count from 1
printf("The digit of %d in the position %d is %d\n",N,p,j+1);
return 0;
}
不使用 2 个循环:
int main()
{
int i,ans,p,N,no_of_digits=0,temp;
printf("Enter two positive integers: ");
scanf("%d%d",&N,&p);
temp=N;
no_of_digits=(int)log10(N) + 1;
while(i<=(no_of_digits-p))
{
ans=N%10;
N=N/10;
i++;
}
printf("The digit of %d in the position %d is %d\n",temp,p,ans);
}
#include <stdio.h>
int getDgtLen (int n);
int main(void)
{
// n is the integer and p is the position needed
int i, q, n, p;
// Prompt for taking the values of n and p
do
{
printf("Enter two positive integers for number, position: ");
scanf("%d%d", &n, &p);
}
while (n < 0 || p <= 0);
int nOrigin = n;
int len = getDgtLen(n);
if (p <= len)
{
for (i = 0; i < p; i++)
{
q = n % 10;
n /= 10;
}
printf("The digit of %d in the position %d is %d\n", nOrigin, p, len - q + 1);
}
else
{
printf("position not found!\n");
}
}
int getDgtLen (int n)
{
int i = 0;
while (n > 0)
{
n /= 10;
i++;
}
return i;
}
void main()
{
int i, j = 0, p, q, N; // N is the integer and p is the position needed
printf("Enter two positive integers: ");
scanf("%d%d", &N, &p); // Taking the values of N and p
for(i = 1; i <= p; i++) {
j = N / 10;
q = j % 10;
i++;
j = q;
}
printf("The digit of %d in the position %d is %d", N, p, j);
}
示例输入:
输入两个正整数:
123456789
3
输出:
The digit of 123456789 in the position 3 is 8
上面的代码行实际上有两个问题:
- 如果我用上面的方法电脑会从右到左开始取数字,而通常情况下,数字的计数是从左到右开始的
- 程序只是在循环中重复自己,这意味着它不会在第二次运行时使用
j
的新值
#include <stdio.h>
int main()
{
int i=0;
int j=0;
int p=5;
int n = 123456;
int digits[12]={};
j=n;
while(j)
{
digits[i]=j%10;
j = j/10;
i++;
}
printf("The digit of %d in the position %d is %d",n,p,digits[i-p]);
return 0;
}
我设计的最简单的方法就是将整数转换为数字并查找。
为什么这样:
避免pow
,log10
因为他们需要浮点支持到运行,硬件浮点到运行快。
并避免两个循环,因为这两个循环会进行大量重复计算。
首先你计算整数的位数,比如n
。然后你可以通过将数字除以10n-1得到第一个数字。然后把它放在一个循环中,减少 n 1 & number N 由
N%=10n-1
int main()
{
int i,j=0,p,N;
printf("Enter two positive integers: ");
scanf("%d%d",&N,&p);
int pow=1,tmp=N;
//counting power of 10 to divide
while(tmp>10)
{
pow*=10;
tmp/=10;
}
tmp=N;
for(i=1; i<=p;i++){
j = tmp/pow;
tmp%=pow;
pow/=10;
}
printf("The digit of %d in the position %d is %d\n",N,p,j);
}
有几种方法可以做到这一点。正如一些评论所建议的那样,您可以执行以下任一操作:
方法一:
将数字转换成字符串数组,可以通过sprintf
.
char str[256];
int len = sprintf(str,"%d",N);
//traverse str using len
方法二:
由于以 b 为底的 n 位数字 N,您可以表示最多 pow(b,n)-1
的任何数字。要获得数字,您可以使用 pow
的反函数,即以 b 为底的对数。您可能无法获得整数值,因此您可以使用 floor
并将结果转换为 int。完整的程序如下所示:
#include <stdio.h>
#include <math.h>
int getDigit(int num, int p)
{
return (num / (int)pow(10, floor(log10(num)) - p)) % 10;
}
int main()
{
int i,j=0,p,q,N;// N is the integer and p is the position needed
printf("Enter two positive integers: ");
scanf("%d%d",&N,&p);// Taking the values of N and p
j = getDigit(N,p);
//The result is j if you count from 0, j+1 if you count from 1
printf("The digit of %d in the position %d is %d\n",N,p,j+1);
return 0;
}
不使用 2 个循环:
int main()
{
int i,ans,p,N,no_of_digits=0,temp;
printf("Enter two positive integers: ");
scanf("%d%d",&N,&p);
temp=N;
no_of_digits=(int)log10(N) + 1;
while(i<=(no_of_digits-p))
{
ans=N%10;
N=N/10;
i++;
}
printf("The digit of %d in the position %d is %d\n",temp,p,ans);
}
#include <stdio.h>
int getDgtLen (int n);
int main(void)
{
// n is the integer and p is the position needed
int i, q, n, p;
// Prompt for taking the values of n and p
do
{
printf("Enter two positive integers for number, position: ");
scanf("%d%d", &n, &p);
}
while (n < 0 || p <= 0);
int nOrigin = n;
int len = getDgtLen(n);
if (p <= len)
{
for (i = 0; i < p; i++)
{
q = n % 10;
n /= 10;
}
printf("The digit of %d in the position %d is %d\n", nOrigin, p, len - q + 1);
}
else
{
printf("position not found!\n");
}
}
int getDgtLen (int n)
{
int i = 0;
while (n > 0)
{
n /= 10;
i++;
}
return i;
}