c语言中123 234 345 456,C程序在一个区间内找到增长的数字

首先,对不起我的英语,如果我的解释不够好。我希望我的代码输出可以帮助您了解它的含义。它的问题是,我的方式,它只能用于999(3位数)。我想应该有一个循环“不关心”有多少数字,只是做了它必须做的事情。

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)。

答案

这是我的看法。将问题分成几部分:你需要一个函数来检查一个数字是否在“增长”,这意味着它的基数10表示中的每个数字都是对应于10的下一个幂的一个数字,直到最高的非零数字。 。 (比看起来正式表达这个概念更难)。

#include

#include

#include

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

#include

#include

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)。我很好奇老师如何为&辩护。

另一答案

您不需要一次跟踪所有位数。您需要检查的是,最后一位数字比最后一位数字多一位

或许这样的事情

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;

}

另一答案

这是问题的可能解决方案。它适用于字符串而不是数字,因此效率较低但可能更容易理解:

#include

#include

#include

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

另一答案

所以这是另一个基于算术的版本:

#include

#include

#include

_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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值