C:如何将一个多位数分解成不同的变量?
假设我在C中有一个多位数的整数,我想把它分解成一位数的整数C:如何将一个多位数分解成不同的变量?,c,math,numbers,digits,digit,C,Math,Numbers,Digits,Digit,假设我在C中有一个多位数的整数,我想把它分解成一位数的整数 123将变成1、2和3 我怎样才能做到这一点,特别是如果我不知道整数有多少位的话?作为提示,获取数字中的第n位非常容易;除以10 n次,然后取模10,或以C表示: int nthdig(int n, int k){ while(n--) k/=10; return k%10; } 123的最后一位数字是123%10。 您可以通过执行123/10来删除123的最后一位数字——使用整数除法将得到12。
123
将变成1
、2
和3
我怎样才能做到这一点,特别是如果我不知道整数有多少位的话?作为提示,获取数字中的第n位非常容易;除以10 n次,然后取模10,或以C表示:
int nthdig(int n, int k){
while(n--)
k/=10;
return k%10;
}
123的最后一位数字是123%10。 您可以通过执行123/10来删除123的最后一位数字——使用整数除法将得到12。 回答您关于“我如何知道您有多少位数”的问题--
尝试按上述方法操作,您将看到如何知道何时停止。首先,计算数字:
unsigned int count(unsigned int i) {
unsigned int ret=1;
while (i/=10) ret++;
return ret;
}
然后,您可以将它们存储在阵列中:
unsigned int num=123; //for example
unsigned int dig=count(num);
char arr[dig];
while (dig--) {
arr[dig]=num%10;
num/=10;
}
我认为下面的代码将有助于
temp = num;
while(temp)
{
temp=temp/10;
factor = factor*10;
}
printf("\n%d\n", factor);
printf("Each digits of given number are:\n");
while(factor>1)
{
factor = factor/10;
printf("%d\t",num/factor);
i++;
num = num % factor;
}
我们可以使用这个程序作为一个有3个参数的函数 #包括 int-nthdig(int-n,int-k){ 而(n--) k/=10; 返回k%10; } int main(){ int numberToSplit=987; printf(“百分之i\n”,第n个数字(2,numberToSplit)); printf(“Tens=%i\n”,nthdig(1,numberToSplit)); printf(“单位=%i\n”,第n个数字(0,numberToSplit)); } 这将导致以下打印输出: 百分之九 十=8
单位=7我是根据@asaelr的代码制作的:
typedef struct digitsArrayPlusNumber {
uint32_t *baseAddress;
uint32_t number;
} digitsArrayPlusNumber;
digitsArrayPlusNumber *splitDigits (uint32_t inValue) {
// based on code from asaelr@stackoverflow.com
uint32_t inputValue = inValue;
//Count digits
uint32_t theCount = 1;
while (inputValue /= 10)
theCount++;
// put in array
uint32_t *arr = malloc(sizeof(uint32_t) * theCount);
uint32_t dig = theCount;
while (dig--) {
arr[dig]=inValue % 10;
inValue /= 10;
// printf ("%d\n", arr[dig]);
}
digitsArrayPlusNumber *dandn = malloc (sizeof(digitsArrayPlusNumber));
dandn->baseAddress = arr;
dandn->number = theCount;
return dandn;
}
int main(int argc, const char * argv[]) {
for (int d = 0; d < splitDigits(12345678)->number; d++)
printf ("%u\n", (splitDigits(12345678)->baseAddress)[d]);
}
typedef结构digitsArrayPlusNumber{
uint32_t*基址;
uint32_t编号;
}digitsArrayPlusNumber;
digitsArrayPlusNumber*拆分数字(uint32无效){
//基于源代码asaelr@stackoverflow.com
uint32\u t输入值=无效;
//数数数字
uint32_t计数=1;
while(inputValue/=10)
count++;
//排列
uint32_t*arr=malloc(单位:uint32_t)*计数);
uint32\u t dig=计数;
而(挖--){
arr[dig]=无效%10;
无效/=10;
//printf(“%d\n”,arr[dig]);
}
digitsArrayPlusNumber*dandn=malloc(sizeof(digitsArrayPlusNumber));
dandn->baseAddress=arr;
dandn->number=计数;
返回dandn;
}
int main(int argc,const char*argv[]{
对于(int d=0;dnumber;d++)
printf(“%u\n”)(拆分数字(12345678)->基址)[d];
}
它工作得很好,谢谢!你可以分而治之,但你已经重写了所有的算术库。我建议使用多精度库,但这当然是一个好的实践你可以使用%10,这意味着如果你把它除以之后的数字就可以得到余数。因此
123%10
是3,因为余数是3,所以减去从123取3,然后是120,然后用10除以120,10等于12。然后执行相同的过程。如果您的int作为char
数据(从用户或文本文件输入…)开始使用,首先不要转换为int(无scanf
,无atoi
)使用字符来分离数字。这不是第n个数字,这是从最小意义开始的第n个数字,你不认为最低有效数字是零。嗯,我认为第一或第123个数字是1,而不是3。
int main(){
long signed c=0,z,a=0,b=1,d=1;
scanf("%ld",&z);
while(a++<2){
if(d++==1)
z/=pow(10,6);
c+=(z%10)*b;
z/=10;
b*=10;}
return c;}
//Based on Tony's answer
#include <stdio.h>
int nthdig(int n, int k){
while(n--)
k/=10;
return k%10;
}
int main() {
int numberToSplit = 987;
printf("Hundreds = %i\n",nthdig(2, numberToSplit));
printf("Tens = %i\n",nthdig(1, numberToSplit));
printf("Units = %i\n",nthdig(0, numberToSplit));
}
typedef struct digitsArrayPlusNumber {
uint32_t *baseAddress;
uint32_t number;
} digitsArrayPlusNumber;
digitsArrayPlusNumber *splitDigits (uint32_t inValue) {
// based on code from asaelr@stackoverflow.com
uint32_t inputValue = inValue;
//Count digits
uint32_t theCount = 1;
while (inputValue /= 10)
theCount++;
// put in array
uint32_t *arr = malloc(sizeof(uint32_t) * theCount);
uint32_t dig = theCount;
while (dig--) {
arr[dig]=inValue % 10;
inValue /= 10;
// printf ("%d\n", arr[dig]);
}
digitsArrayPlusNumber *dandn = malloc (sizeof(digitsArrayPlusNumber));
dandn->baseAddress = arr;
dandn->number = theCount;
return dandn;
}
int main(int argc, const char * argv[]) {
for (int d = 0; d < splitDigits(12345678)->number; d++)
printf ("%u\n", (splitDigits(12345678)->baseAddress)[d]);
}