首先,对不起我的英语,如果我的解释不够好。我希望我的代码输出可以帮助您了解它的含义。问题在于,按照我的方式,它只能用于999(3位数字)。我想应该有一个“#34;不关心"有多少位数,只是做了它必须做的事情。
int main(){
int n, m, k, digit1, digit2, digit3, p, a = 0;
do{
printf("Enter m and n (m < n):\n"); scanf("%d %d", &m, &n);
if (m < n) {
break;
}
else printf("\Error - m > n! Try again.\n\n");
} while (a == 0);
printf("Output:\n");
for (k = m; k <= n; k++){
p = k;
do{
digit3 = p % 10; //123 % 10 = 3 13%10 = 3 == p/10 +1
digit1 = p / 100; //123 / 100 = 1
digit2 = (p / 10) % 10; // (123 /10) = 12%10 = 2
if (p > 100){
if ( digit2 == digit1 + 1 && digit3 == digit2 + 1){
printf("%d ", k);
} break;
}
if (digit3 == ((p / 10) + 1)) {
printf("%d ", k);
} break;
p = p / 10;
} while (p > 0);
}
getch();
return 0;
}
示例输出:
Enter m and n (m < n):
1 999
Output:
1 12 23 34 45 56 67 78 89 123 234 345 456 567 678 789
此输出正确,这是程序必须执行的操作。不幸的是,我无法想出循环使其工作超过999.它应输出所有数字(在用户输入的间隔内),其中每个数字比前一个数字更大(按1)。
答案 0 :(得分:2)
您不需要一次跟踪所有位数。 您需要检查的是,最后一位数字比第二位数字多一个
这样的事可能
int main(){
int n, m, k, digit1, digit2, digit3, p, a = 0;
do{
printf("Enter m and n (m < n):\n"); scanf("%d %d", &m, &n);
if (m < n) {
break;
}
else printf("\Error - m > n! Try again.\n\n");
} while (a == 0);
printf("Output:\n");
k = m;
while(k++ <= n){
int p = k;
int flag = 0;
int num;
while(p > 10){
// Get the last digit
// in case of 123 -> 3
num = p % 10;
// Reduce p by 10
// 123 -> 12
p = p/10;
// check 3 == 12%10 + 1
// if this is correct go back to start of the loop
// we may have more digits
if(num == p % 10 + 1) continue;
// So the digits dont match, set the flag
// break out of the loop
flag = 1;
break;
}
// Outside the loop check the flag and print
if(k > 10 && !flag)
printf("%d ",k);
}
return 0;
}
答案 1 :(得分:2)
这是我的看法。将问题分成几部分:你需要一个函数来检查一个数字是否在“增长”,这意味着它的基数10表示中的每个数字都是对应于10的下一个幂的一个数字,直到最高的非零数字。 。 (比看起来正式表达这个概念更难)。
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
bool growing(unsigned int x)
{
//if (x < 10)
// return false;
unsigned int last = x % 10 + 1;
while (x>0) {
unsigned int cur = x % 10;
x /= 10;
if (cur != last-1)
return false;
last = cur;
}
return true;
}
int main(void)
{
unsigned int m = 1;
unsigned int n = 123456789;
for (unsigned int i = m; i <= n; ++i) {
if (growing(i)) {
printf("%i ", i);
}
}
}
您应该决定是否接受一个数字。如果是,请取消注释前两行。
显然,可能增长的最高数字是123456789。
编辑:一个无函数版本,直接将函数移动到for循环中:
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
unsigned int m = 1;
unsigned int n = 123456789;
for (unsigned int i = m; i <= n; ++i) {
unsigned int x = i;
bool growing = true;
//if (x < 10)
// growing = false;
unsigned int last = x % 10 + 1;
while (x>0) {
unsigned int cur = x % 10;
x /= 10;
if (cur != last - 1)
growing = false;
last = cur;
}
if (growing) {
printf("%i ", i);
}
}
}
设置增长为false后,您可以获得稍快的版本。
无用的咆哮:我不明白为什么人们在学生能够理解基本内容之前继续教I / O.不是教授函数,而是在没有意识到的情况下编写一个函数(main
),并在不知道指针的情况下调用其他函数(scanf
,printf
)。我很好奇老师如何证明&
。
答案 2 :(得分:0)
这是问题的可能解决方案。它适用于字符串而不是数字,因此效率较低,但可能更容易理解:
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m, n, i, j;
char buf[20], c, last;
_Bool ascending;
puts("Enter m and n (m < n):");
scanf("%d %d", &m, &n);
if (m >= n) {
fprintf(stderr, "m must be smaller than n");
exit(EXIT_FAILURE);
}
puts("Output:");
for (i = m; i < n; i++) {
sprintf(buf, "%d", i);
ascending = true;
last = 0;
for (j = 0; buf[j] != 0; j++) {
c = buf[j];
if (last != 0 && last != c - 1) {
ascending = false;
break;
} else {
last = c;
}
}
if (ascending) {
printf("%d ", i);
}
}
return EXIT_SUCCESS;
}
然而,它的输出看起来略有不同:
Enter m and n (m < n):
1 999
Output:
1 2 3 4 5 6 7 8 9 12 23 34 45 56 67 78 89 123 234 345 456 567 678 789
我想知道实际的规则是什么,因为2到9之间的数字比1更高或更低,不是吗?
这是更大数字的输出:
Enter m and n (m < n):
1 10000
Output:
1 2 3 4 5 6 7 8 9 12 23 34 45 56 67 78 89 123 234 345 456 567 678 789 1234 2345 3456 4567 5678 6789
答案 3 :(得分:0)
所以这是基于算术的另一个版本:
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
_Bool only_consecutive_figures(int number)
{
int figure, last;
for (last = 0; number > 0; number /= 10) {
figure = number % 10;
if ((last != 0 && last != figure + 1) || figure == 0) {
return false;
}
last = figure;
}
return true;
}
int main()
{
int m, n, i;
puts("Enter m and n (m < n):");
scanf("%d %d", &m, &n);
if (m >= n) {
fprintf(stderr, "m must be smaller than n");
exit(EXIT_FAILURE);
}
puts("Output:");
for (i = m; i < n; i++) {
if (only_consecutive_figures(i)) {
printf("%d ", i);
}
}
putchar('\n');
return EXIT_SUCCESS;
}