C. Problem C.永恒(eternity.cpp)
内存限制:256 MiB
时间限制:1000 ms
标准输入输出
题目类型:传统
评测方式:文本比较
题目描述:
「稻妻」是「永恒」的国度。
巴尔泽布认为,如果一个数的所有数位上的数的和是原数的因数,那么这个数就是一个「永恒数」。
她希望你为她找出小于等于 n 的所有正整数中,所有的「永恒数」。
输入格式:
一个整数n 。
输出格式:
若干个整数,表示小于等于 n 的「永恒数」,从小至大依次输出,之间用一个空格分隔。
样例:
【样例 1 输入】
11
【样例 1 输出】
1 2 3 4 5 6 7 8 9 10
【样例 2 输入】
23
【样例 2 输出】
1 2 3 4 5 6 7 8 9 10 12 18 20 21
数据范围与提示:
【样例解释 #1】
在小于等于 11 的所有正整数中,只有 11 不为「永恒数」。
【数据范围】
对于 20% 的数据,1<=n<=10。
对于 60% 的数据,1<=n<=100。
对于 100% 的数据,1<=n<=1000。
思路:
这道题,我们先定义一个int类型整数n,输入n之后,我们进行一次for循环,依次遍历1~n之间的所有数字i,在循环之中,我们需要判断这个数i是不是永恒数。
怎么判断这个数是不是永恒数呢?题目上说了,如果i的各位数之和是n的倍数或者因数的话,那么就是一个永恒数。仔细观察后我们发现,如果i为一位数,那么i的各位数之和就等于i,是i的最大因数(包括自身),所以只要i是一位数,i就是一个永恒数(在样例输出处可以看出来)。
之后,如果不是一位数,那么我们就需要“正儿八经”的来判断i是不是永恒数了,我们可以写一个函数pd,参数为一个int类型的整数a,返回值为bool,这个函数的左移就是判断一个数是不是永恒数,如果是就返回tue,不是就返回false.
在函数里面,因为求a的各位数之和,需要改变a的值,这是不行的,所以我们可以定义一个新的int类型变量x,刚开始就赋值为a,之后我们要定义一个sum,初始化为0,来代表x的各位数之和,最后我们用while循环求x的各位数之和(相当于a的各位数之和),我们知道将x%10的结果就是x的个位数,所以将x%10的值加在sum上面,为了求x的十位数,我们需要将x/10,这样以后,x的个位数就是原来x的十位数,这样一直循环下去,直到x/10之后等于10.
这个循环过后,我们求出了a的个位数之和sum,我们进行一次判断,如果sum是a的因数或者sum是a的倍数,那么就返回true代表是永恒数,否则返回false,代表不是永恒数。
代码:
#include<bits/stdc++.h> //万能头文件
using namespace std; //批准使用std.
bool pd(int a){ //判断a是不是永恒数
int x=a,sum=0; //定义
while(x!=0){ //求x的个位数之和
sum+=x%10; //将x的个位数加到sum上
x/=10; //让x的个位数变为原来x的十位数
}
if(a%sum==0||sum%a==0) //判断sum是不是a的因数或者倍数
return true; //是永恒数
return false; //不是永恒数
}
int main(){ //main主函数
int n; //定义
cin>>n; //输入
for(int i=1;i<=n;i++){ //进行for循环遍历1~n
if(i<10) //如果是一位数
cout<<i<<" "; //就肯定是永恒数
else //如果不是一位数
if(pd(i)) //进行判断函数
cout<<i<<" "; //如果返回值为真就是永恒数
}
return 0; //结束
}
总结:
这道题其实并不怎么难,考点就是函数的应用与求整数的各位数(这个是非常容易考的)!