输出指定长度和总和的数字
Output a number with specified length and sum
我必须用 C 编写一个程序,它接受整数、sumOfDig 和 lengthOfNum。 sumOfDig 等于数字的总和,lengthOfNum 等于数字的长度。
我不允许使用数组或 math.lib
1 ≤ sumOfDig ≤ 81 且 1 ≤ lengthOfNum ≤ 9
我试图写一个 while 循环,但我想不出一种方法可以构建一个数字并从数字总和中减去最后添加的数字。
#include <stdio.h>
#include <stdlib.h>
int main() {
int lengthOfNum; /* stores the length of the number */
int sumOfDig; /* stores the sum of the digits */
int ans; /* stores the answer */
scanf("%d", &sumOfDig); /* scans the sum of the digits */
scanf("%d", &lengthOfNum); /* scans the length of the number */
ans=0; /* initializes ans */
/* adds a number to ans, and removes it from sumOfDig */
while(sumOfDig!=0 && lengthOfNum!=0) {
/*???*/
lengthOfNum--;
};
printf("%d\n", ans); /* prints the outcome */
return 0;
}
输入和输出如下:
输入:20 2 输出:不可能
输入:20 3 输出:992(因为长度是 3 且 9+9+2=20)
输入:50 8 输出:99999500(因为长度是 8 和 9+9+9+9+9+5+0+0=50)
我们称数字之和为S,指定长度为L。
首先,我们需要检查是否有解决方案。我们需要的最小位数将取决于 9 分成 S 的次数。
- 找出 9 次如何除以 S。我们称其为 Q。
- 求上述除法的余数。我们称这个为 R.
- 如果R为0,
- 如果L小于Q,
- 无解。
- 否则,
- 如果L小于Q+1,
- 无解。
现在,我们可以生成输出了。
- 输出Q
9
s.
- 如果 R 不为 0,
- 输出R.
- 输出 L-Q-1
0
.
- 其他
- 输出 L-Q
0
.
或
- 输出Q
9
s.
- 将 Z 设置为 L-Q。
- 如果 R 不为 0,
- 输出R.
- 减少Z。
- 输出 Z
0
.
还有其他方法。您可以通过在缓冲区中构建输出(甚至在 int
中)来避免首先检查输入,但我使用了一个易于可视化并遵循通常需要的在计算之前进行验证的约定。
除法可以作为一个循环来完成,这为您提供了我提到的替代方法的基础。
unsigned R = S;
unsigned Q = 0;
while (R > 9) {
R -= 9;
++Q;
}
我在这里给出的是提示,而不是整个解决方案。
- 了解对于给定的位数和长度可以有很多正确答案。
- 使用的算法是一直输出9,直到剩余位数之和小于9。
算法如下。
- 如果位数之和 > len *9 --> output Not possible --> end
- 循环数字。
- if sum_digits >= 9, --> 输出字符9, --> hint use
printf ("9");
- 将 sum_digits 减 9。
- else 输出字符 (sum_digits) --> 使用
printf ("%c",sum_digits+'0');
- 将 sum_digits 设置为 0。
我必须用 C 编写一个程序,它接受整数、sumOfDig 和 lengthOfNum。 sumOfDig 等于数字的总和,lengthOfNum 等于数字的长度。 我不允许使用数组或 math.lib
1 ≤ sumOfDig ≤ 81 且 1 ≤ lengthOfNum ≤ 9
我试图写一个 while 循环,但我想不出一种方法可以构建一个数字并从数字总和中减去最后添加的数字。
#include <stdio.h>
#include <stdlib.h>
int main() {
int lengthOfNum; /* stores the length of the number */
int sumOfDig; /* stores the sum of the digits */
int ans; /* stores the answer */
scanf("%d", &sumOfDig); /* scans the sum of the digits */
scanf("%d", &lengthOfNum); /* scans the length of the number */
ans=0; /* initializes ans */
/* adds a number to ans, and removes it from sumOfDig */
while(sumOfDig!=0 && lengthOfNum!=0) {
/*???*/
lengthOfNum--;
};
printf("%d\n", ans); /* prints the outcome */
return 0;
}
输入和输出如下:
输入:20 2 输出:不可能
输入:20 3 输出:992(因为长度是 3 且 9+9+2=20)
输入:50 8 输出:99999500(因为长度是 8 和 9+9+9+9+9+5+0+0=50)
我们称数字之和为S,指定长度为L。
首先,我们需要检查是否有解决方案。我们需要的最小位数将取决于 9 分成 S 的次数。
- 找出 9 次如何除以 S。我们称其为 Q。
- 求上述除法的余数。我们称这个为 R.
- 如果R为0,
- 如果L小于Q,
- 无解。
- 如果L小于Q,
- 否则,
- 如果L小于Q+1,
- 无解。
- 如果L小于Q+1,
现在,我们可以生成输出了。
- 输出Q
9
s. - 如果 R 不为 0,
- 输出R.
- 输出 L-Q-1
0
.
- 其他
- 输出 L-Q
0
.
- 输出 L-Q
或
- 输出Q
9
s. - 将 Z 设置为 L-Q。
- 如果 R 不为 0,
- 输出R.
- 减少Z。
- 输出 Z
0
.
还有其他方法。您可以通过在缓冲区中构建输出(甚至在 int
中)来避免首先检查输入,但我使用了一个易于可视化并遵循通常需要的在计算之前进行验证的约定。
除法可以作为一个循环来完成,这为您提供了我提到的替代方法的基础。
unsigned R = S;
unsigned Q = 0;
while (R > 9) {
R -= 9;
++Q;
}
我在这里给出的是提示,而不是整个解决方案。
- 了解对于给定的位数和长度可以有很多正确答案。
- 使用的算法是一直输出9,直到剩余位数之和小于9。
算法如下。
- 如果位数之和 > len *9 --> output Not possible --> end
- 循环数字。
- if sum_digits >= 9, --> 输出字符9, --> hint use
printf ("9");
- 将 sum_digits 减 9。
- else 输出字符 (sum_digits) --> 使用
printf ("%c",sum_digits+'0');
- 将 sum_digits 设置为 0。
- if sum_digits >= 9, --> 输出字符9, --> hint use