C: 다자리 숫자를 별도의 변수로 분할하는 방법은?
내가 C로 여러 자리 정수를 가지고 있다고 치자.한 자리 정수로 나누고 싶습니다.
123로 변할 것입니다.1,2,그리고.3.
특히 정수가 몇 자리인지 모르는 경우에는 어떻게 해야 합니까?
int value = 123;
while (value > 0) {
int digit = value % 10;
// do something with digit
value /= 10;
}
먼저 숫자를 세어 봅니다.
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;
}
힌트로 n번째 숫자를 숫자로 구하는 것은 매우 쉽습니다. 10n번으로 나눈 다음 mod 10 또는 C:
int nthdig(int n, int k){
while(n--)
k/=10;
return k%10;
}
123의 끝자리는 123% 10입니다.123/10 을 수행하면 끝자리 123 을 떨어뜨릴 수 있습니다. 정수 나눗셈을 사용하면 12가 됩니다."당신이 몇 자리의 숫자를 가지고 있는지 어떻게 알 수 있나요?"에 대한 질문에 답하려면 위에서 설명한 대로 해보세요. 그러면 언제 멈춰야 하는지 알 수 있을 것입니다.
아래의 코드가 도움이 될 것 같습니다.
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;
}
//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));
}
그러면 다음과 같은 인쇄물이 나옵니다.
수백 = 9
십 = 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]);
}
잘 작동합니다, 감사합니다!
%10 을 사용할 수 있는데, 이는 나눈 뒤의 숫자가 나머지를 의미하기 때문에123 % 10는 3이고 나머지는 3이므로 123에서 3을 뺀 다음 120이고 120을 10으로 나눈 다음 12입니다.그리고 똑같은 과정을 합니다.
//This is c#, but you can see how easy it would be to convert
//to another language.
int myNumber = 123456;
string myWord = Convert.ToString(myNumber);
string partOne = myWord.Substring(0, 2);
string partTwo = myWord.Substring(2, 2);
string partThree = myWord.Substring(4, 2);
int num01 = Convert.ToInt32(partOne);
int num02 = Convert.ToInt32(partTwo);
int num03 = Convert.ToInt32(partThree);
Console.WriteLine(num01);
Console.WriteLine(num02);
Console.WriteLine(num03);
Output:
12
34
56
우리는 이 프로그램을 3개의 인수를 가진 함수로 사용할 수 있습니다.여기서 "while(a++<2)"에서 2는 필요한 자릿수입니다(하나의 인수로 제공 가능). 2를 필요한 자릿수가 아닌 자릿수로 바꿉니다.여기서 우리는 "z/=pow(10,6)"을 사용할 수 있습니다. 만약 우리가 마지막 특정 숫자가 필요 없다면, 6을 필요 없는 숫자의 숫자로 바꿀 수 있습니다(다른 인수로 줄 수 있습니다). 그리고 세 번째 인수는 당신이 깨야 할 숫자입니다.
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;}
분할하여 정복할 수 있지만 산술 라이브러리를 모두 다시 작성할 수 있습니다.저는 고정밀 라이브러리를 사용하는 것을 제안합니다. https://gmplib.org 하지만 물론 좋은 연습입니다.
언급URL : https://stackoverflow.com/questions/9302681/c-how-to-break-apart-a-multi-digit-number-into-separate-variables
'programing' 카테고리의 다른 글
| 응답 J를 검색하는 방법jquery $.jax 객체의 SON 속성 (0) | 2023.11.01 |
|---|---|
| INET6_ADDRSTRLEN이 C에서 46으로 정의된 이유는 무엇입니까? (0) | 2023.11.01 |
| Woocommerce 제품 변동 드롭다운에 변동 재고 수량 및 상태 추가 (0) | 2023.11.01 |
| PHP에서 하이버네이트와 비슷한 것이 있습니까? (0) | 2023.11.01 |
| 업데이트 시 데이터베이스 복제 속도가 매우 느림 (0) | 2023.11.01 |