首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >找到有汇合点的数字河流

找到有汇合点的数字河流
EN

Stack Overflow用户
提问于 2022-10-17 22:27:08
回答 1查看 60关注 0票数 1

我现在有一个问题要解决,这是我们老师给我们的。我完全是刚进入C语言并编写代码的:

数字河流是一个数字序列,其中每个数字后面跟着相同的数字加上它的数字之和。在这样的序列中,123后面跟着129 (因为1+2+3= 6),然后又是141。

任务:数字河流可以满足。当两条数字河流共享相同的值时,就会发生这种情况。河流32在47时遇到河流47,而河流471在519与河480相遇。从stdin读取一个数字N,并打印所有在这个数字上相遇的河流。

我现在有一个计算数字河流的代码。我真的不知道怎么继续下去。

代码语言:javascript
运行
复制
#include <stdio.h>


int digitsum(int n)
{
    int sum = 0;
    while (n > 0) {
        int digit = n % 10;
        sum = sum + digit;
        n = n / 10;
    }
    return sum;
}

int nextnum(int digitsum, int n)
{
    int sum = 0;
    sum = n + digitsum;
    printf("%d\n", sum);
    return sum;
}


int main()
{
  int n;
  printf("N--> ");
  scanf("%d", &n);

  for (int i = 0; i < 20; i++) {
    n = nextnum(digitsum(n), n);
  }

  return 0;
}

如果我输入N-> 32,它应该打印出在某个时间点与32河相交的所有数字河流。比方说,我们把输入限制在500。我是否应该从1开始为所有事物创建数组,然后比较这些数组?也许我在想复杂的事情,而你们有个提示。

它应该是这样的:

代码语言:javascript
运行
复制
N--> 32
{5,10,11,13,17,25,32,37,47.......}
{10,11,13,17,25,32,37,47.............}
{11,13,17,25,32,37,47................}
{13,17,25,32,37,47...................}
....
{32,37,47............................}

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-18 00:36:48

正如注释中所指出的,倒退是一种复杂的算法。因此,作为一种折衷方法,在输入值不超过500的参数下,我添加了一个函数,从"1“开始,构建一条河流,看看它是否符合用户输入的值。另外,为了线性地打印出河流,我添加了一个辅助函数来完成这个任务。有了这些额外的资格,以下是一个经过修订的版本,追捕河流的开始和满足进入的河流。

代码语言:javascript
运行
复制
#include <stdio.h>

int digitsum(int n)
{
    int sum = 0;
    if (n < 10)         /* Function was not picking up any starting values under 10 */
        return n;
    while (n > 0)
    {
        int digit = n % 10;
        sum = sum + digit;
        n = n / 10;
    }
    return sum;
}

int nextnum(int digitsum, int n)
{
    int sum = 0;
    sum = n + digitsum;

    return sum;
}

void print_river(int x)
{
    if (x <= 500)
    {
        printf("%d ", x);
    }
    while (x < 500)
    {
        x = nextnum(digitsum(x), x);
        if (x <= 500)
        {
            printf("%d ", x);
        }
    }
    printf("\n");
}

void preceding(int x)
{
    int z = 0;
    for (int j = 1; j < x; j++)
    {
        z = j;

        for (int k = 0; k < x; k++)
        {
            z = digitsum(z) + z;
            if (z >= x)
            {
                if (z == x)
                {
                    print_river(j);
                }
                break;
            }
        }
    }

}

int main()
{
    int n;
    printf("N--> ");
    scanf("%d", &n);

    preceding(n);
    print_river(n);

    while (n < 500)
    {
        n = nextnum(digitsum(n), n);
        print_river(n);
    }

    return 0;
}

前面的函数从"1“开始,并继续定位满足输入值的河流。函数print_river为每条河流生成打印输出。额外的化妆品测试被添加到只有500的打印值。

以下是"32“河终端输出的样本。

代码语言:javascript
运行
复制
@Una:~/C_Programs/Console/River/bin/Release$ ./River 
N--> 32
5 10 11 13 17 25 32 37 47 58 71 79 95 109 119 130 134 142 149 163 173 184 197 214 221 226 236 247 260 268 284 298 317 328 341 349 365 379 398 418 431 439 455 469 488 
10 11 13 17 25 32 37 47 58 71 79 95 109 119 130 134 142 149 163 173 184 197 214 221 226 236 247 260 268 284 298 317 328 341 349 365 379 398 418 431 439 455 469 488 
11 13 17 25 32 37 47 58 71 79 95 109 119 130 134 142 149 163 173 184 197 214 221 226 236 247 260 268 284 298 317 328 341 349 365 379 398 418 431 439 455 469 488 
13 17 25 32 37 47 58 71 79 95 109 119 130 134 142 149 163 173 184 197 214 221 226 236 247 260 268 284 298 317 328 341 349 365 379 398 418 431 439 455 469 488 
17 25 32 37 47 58 71 79 95 109 119 130 134 142 149 163 173 184 197 214 221 226 236 247 260 268 284 298 317 328 341 349 365 379 398 418 431 439 455 469 488 
25 32 37 47 58 71 79 95 109 119 130 134 142 149 163 173 184 197 214 221 226 236 247 260 268 284 298 317 328 341 349 365 379 398 418 431 439 455 469 488 
32 37 47 58 71 79 95 109 119 130 134 142 149 163 173 184 197 214 221 226 236 247 260 268 284 298 317 328 341 349 365 379 398 418 431 439 455 469 488 
37 47 58 71 79 95 109 119 130 134 142 149 163 173 184 197 214 221 226 236 247 260 268 284 298 317 328 341 349 365 379 398 418 431 439 455 469 488 
47 58 71 79 95 109 119 130 134 142 149 163 173 184 197 214 221 226 236 247 260 268 284 298 317 328 341 349 365 379 398 418 431 439 455 469 488 
58 71 79 95 109 119 130 134 142 149 163 173 184 197 214 221 226 236 247 260 268 284 298 317 328 341 349 365 379 398 418 431 439 455 469 488 
71 79 95 109 119 130 134 142 149 163 173 184 197 214 221 226 236 247 260 268 284 298 317 328 341 349 365 379 398 418 431 439 455 469 488 
79 95 109 119 130 134 142 149 163 173 184 197 214 221 226 236 247 260 268 284 298 317 328 341 349 365 379 398 418 431 439 455 469 488 
95 109 119 130 134 142 149 163 173 184 197 214 221 226 236 247 260 268 284 298 317 328 341 349 365 379 398 418 431 439 455 469 488 

该列表继续超过值"95“,但我不想将其全部插入到这个文本中。

试一试,看看它是否符合你的项目精神。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74103901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档