C语言 · 寂寞的数

算法训练 寂寞的数

时间限制:1.0s   内存限制:256.0MB

问题描述

  道德经曰:一生二,二生三,三生万物。
  对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和。例如,d(23)=23+2+3=28, d(1481)=1481+1+4+8+1=1495。
  因此,给定了任意一个n作为起点,你可以构造如下一个递增序列:n,d(n),d(d(n)),d(d(d(n)))....例如,从33开始的递增序列为:
  33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
  我们把n叫做d(n)的生成元,在上面的数列中,33是39的生成元,39是51的生成元,等等。有一些数字甚至可以有两个生成元,比如101,可以由91和100生成。但也有一些数字没有任何生成元,如42。我们把这样的数字称为寂寞的数字。

输入格式

  一行,一个正整数n。

输出格式

  按照升序输出小于n的所有寂寞的数字,每行一个。

样例输入

40

样例输出

1
3
5
7
9
20
31

数据规模和约定

  n<=10000

 1 #include<stdio.h>
 2 int He(int n){//求n的各个位数的和
 3     if(n<10) return n;//递归出口
 4     else return n%10 + He(n/10);//递归调用
 5 }
 6 int main(){
 7     int n,sum;
 8     int a[10000];//a用来放0~n的所有生成元
 9     scanf("%d",&n);
10     for(int i=0;i<n;i++){//遍历,算生成元,用a放
11         a[i]=i+He(i);
12     }
13     int b[5000];//b用来放寂寞的数
14     for(int i=0;i<n;i++){//遍历0~n
15         for(int j=0;j<n;j++){//遍历数组a
16             if(i==a[j]){//0~n中存在与生成元相等的数则非寂寞的数,数组b中的相应位置赋值为1
17                 b[i]=1;
18             }
19         }
20     }
21     for(int i=0;i<n;i++){//遍历b,格式输出所有不为1的元素
22         if(b[i]!=1){
23             printf("%d\n",i);
24         }
25     }
26 }
时间: 2024-08-02 11:04:01

C语言 · 寂寞的数的相关文章

C语言函数參数传递原理

C语言中參数的传递方式一般存在两种方式:一种是通过栈的形式传递.还有一种是通过寄存器的方式传递的. 这次.我们仅仅是具体描写叙述一下第一种參数传递方式,第二种方式在这里不做具体介绍. 首先,我们看一下,以下一个简单的调用例程: int Add (int a, int b, int c) { return a+b+c; } void main() { int x =0 , y = 1, z = 2; int result = 0; result = Add(x, y, z); printf("Re

C语言统计字符数

一段统计字符数的代码及分析. 先贴代码: #include<stdio.h> #include<string.h>//提供memset函数原型. int main() { char S[80]; int C[26],length;//一段声明,即字符数组S,整型数组C,和整型length. memset(C,0,sizeof(C));//将C清零,至于为什么不把字符数组清零,稍后有一段实验过程. for(int i=0;i<=3;i++)//循环4次,读入4行字符串. { g

【零基础学习iOS开发】【02-C语言】10-函数

一.基本概念 1.什么是函数 不论什么一个C语言程序都是由一个或者多个程序段(小程序)构成的.每一个程序段都有自己的功能,我们一般称这些程序段为"函数". 所以.你能够说C语言程序是由函数构成的. 比方你用C语言编写了一个MP3播放器程序.那么它的程序结构例如以下图所看到的: 从上图能够看出:函数就是用来实现某个功能的程序段,每个函数都有自己的功能.因此,你应该把实现某个功能所需的代码都写在函数中. 比方.有个函数的功能是播放MP3.那么播放MP3的代码都应该写到这个函数中. 当调用(

C语言实现两数相加2018-09-23

/*给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807*//** * Definition for singly-linked list. * struct ListNode { * int val; * str

go语言系列-从数组到map

数组 数组可以存放多个同一类型数据.数组也是一种数据类型,在Go中,数组是值类型 一个养鸡场有6只鸡,它们的体重分别是3kg,5kg,1kg,3.4kg,2kg,50kg.请问这六只鸡的总体重是多少?平均体重是多少? 使用传统的方法不利于数据的管理和维护 传统的方法不够灵活,因此我们引出需要学习的新的数据类型 ==>数组 //使用数组的方式来解决问题 var 数组名 [数组大小]数据类型 var a [5]int 赋初值 a[0] = 1 a[1] = 30 ... func main() {

【零基础学习iOS开发】【02-C语言】11-函数的声明和定义

在上一讲中,简单介绍了函数的定义和使用,只要你想完成一个新功能,首先想到的应该是定义一个新的函数来完成这个功能.这讲继续介绍函数的其他用法和注意事项. 一.函数的声明 1.在C语言中,函数的定义顺序是有讲究的:默认情况下,只有后面定义的函数才可以调用前面定义过的函数 1 int sum(int a, int b) { 2 return a + b; 3 } 4 5 int main() 6 { 7 int c = sum(1, 4); 8 return 0; 9 } 第5行定义的main函数调用

【c语言】将一个数的二进制序列逆序,然后输出逆序之后的二进制序,所对应的数

// 将一个数的二进制序列逆序,然后输出逆序之后的二进制序,所对应的数 #include <stdio.h> // 从原数拿出最低位,放到mid中,mid左移,原数右移 int reverse(int a) { int mid = 0; int bit; int n = 31; for (; n > 0; --n) { bit = a & 1; mid |= bit; mid <<= 1; a >>= 1; } return mid; } int main

C语言 &#183; 回形取数

基础练习 回形取数 时间限制:1.0s   内存限制:512.0MB 问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下. 输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列.接下来m行每行n个整数,表示这个矩阵. 输出格式 输出只有一行,共mn个数,为输入矩阵回形取数得到的结果.数之间用一个空格分隔,行末不要有多余的空格. 样例输入 3 31 2 34 5 67 8 9 样例输出 1 4 7 8 9 6 3

【C语言】04-函数

一.函数的分类 前面已经说过,C语言中的函数就是面向对象中的"方法",C语言的函数可以大概分为3类: 1.主函数,也就是main函数.每个程序中只能有一个.也必须有一个主函数.无论主函数写在什么位置,C程序总是从主函数开始执行 2.开发人员自定义的函数,可有可无,数目不限 3.C语言提供的库函数,例如stdio.h中的输出函数printf()和输入函数scanf() 二.函数的声明和定义 虽说C中的函数类似于Java中的方法,但在使用上还是有区别的. 1.在Java中,每个方法的定义顺