用户将输入一个4位长的数字。该数字总是4位数。我需要找出一种方法来分解4位数的长数,并读取每个数字。一旦我有了每个数字,我就会对它进行计算:
int num;
num = (num + 7) % 10
我将添加7,然后除以10,并取余数并使用该值作为新值。然后我会打印出余数。
如何分解4位长号码,并使用个别数字进行计算?
此外,我必须能够扭转这一过程。如果我只给出余数,我该如何打印原始数字?
答案 0 :(得分:1)
int number; //suppose number is 7653
...
int n = number; //n = 7653
int lastDigit = n%10; //3
n/=10; //n = 765
int thirdDigit = n%10; //5
n/=10; //n = 76
int secondDidit = n%10; //6
n/=10; //n = 7
int firstDigit = n; //7
这显然也可以在循环中完成。
答案 1 :(得分:0)
递归例程将处理4位数字以及32位unsigned
最多9位数。
unsigned R7(unsigned x) {
unsigned y = 0;
if (x >= 10) {
y = R7(x / 10) * 10;
}
y += (x % 10 + 7) % 10;
return y;
}
int main(void) {
printf("%04u\n", R7(1));
printf("%04u\n", R7(12));
printf("%04u\n", R7(123));
printf("%04u\n", R7(4321));
printf("%04u\n", R7(987654321));
return 0;
}
// Output
0008
0089
0890
1098
654321098
要反转此过程,请添加3而不是7。
答案 2 :(得分:0)
另一种方法是将数字作为字符串读取,然后将每个字符传递给2字符串,并使用atoi
获取数值。然后,它可以通过将转换限制为前四个字符来处理任意数量的数字输入:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
char *line = NULL; /* pointer to use with getline () */
ssize_t read = 0; /* number of characters read */
size_t n = 0;
int cnt = 0;
char numstr[] = "a"; /* array to hold each char of input */
int num = 0; /* number result */
printf ("\nEnter a 4-digit number (or ctrl+d to quit)\n");
while (printf ("\n input: ") && (read = getline (&line, &n, stdin)) != -1) {
if (read > 4) {
for (cnt = 0; cnt < 4; cnt++) {
numstr[0] = line[cnt];
num = (atoi (numstr) + 7) % 10;
printf (" ( %d + 7 ) %% 10 = %d\n", atoi (numstr), num);
}
}
}
printf ("\n");
return 0;
}
注意:进一步输入验证(例如确认输入的每个字符是数字)留作练习。这只是为了显示将输入处理为字符串的机制。
<强>输出:强>
./bin/digits
Enter a 4-digit number (or ctrl+d to quit)
input: 1234
( 1 + 7 ) % 10 = 8
( 2 + 7 ) % 10 = 9
( 3 + 7 ) % 10 = 0
( 4 + 7 ) % 10 = 1
input: 23456
( 2 + 7 ) % 10 = 9
( 3 + 7 ) % 10 = 0
( 4 + 7 ) % 10 = 1
( 5 + 7 ) % 10 = 2