目录
1.求素数
2.求完全数
3.求水仙花数
4.求回文数
5.求阿姆斯特朗数
1.求素数
1.素数的原理:判断一个数是否为素数的基本原理是:一个大于 1 的自然数,如果除了 1 和它自身外,不能被其他自然数整除(即不能被其他数除尽,余数不为 0),那么这个数就是素数。
2.思路:小编的思路是素数既然只能被两个数字整除,那就判断一个数被整除次数只能为二,那么就要用两个for循环,第一个来表示取100以内的值,第二个for循化来从一除到取值。例如判断8是不是素数,那么就从1,2,3,4,5,6,7,8来分别进行除法,能被整除的有4个1,2,4,8.所以8不是素数。
3.代码如下:
#include<stdio.h>
//找素数
int main() {
for (int i = 1; i <= 100; i++)//规定一百以内的数字
{
int a = 0;
for (int j = 1; j <= i; j++)//不断将i的值从一除到他自己本身
{
if (i % j == 0)
{
a++;//素数能够被整除就只有1和自己两个数字
}
}
if (a == 2 || a == 1)
{
printf(" %d\n", i);
}
}
return 0;
}
淡然小编还在if语句单独判断了1这个特殊数字,每次循环后别忘了重置a的值为0。
2.求完全数
1.完全数的原理:完全数是指所有真因子(即除了自身以外的约数)的和恰好等于它本身的数。
2.思路:小编认为完全数与素数的写法基本一致,在第二个循环中判断能否被除尽,即取模为0;如果为0,那么就相加,保存在一个变量里。
3.代码如下:
#include<stdio.h>
int main()
{
for (int i = 1; i < 100; i++)
{
int a=0;
for (int j = 1; j < i; j++)
{
if (i%j==0) //判断是否被除尽
{
a = a + j;
}
}
if (a == i) { //判断是否满足完全数的条件
printf(" %d", i);
}
}
}
当然,还是别忘记重置a的值。
3.水仙花数
1。水仙花数原理:水仙花数是指一个三位数,其每个数位上的数字的立方和等于该数本身。
原理在于对三位数进行数位拆分,分别获取百位、十位和个位上的数字,然后计算这三个数字的立方和,并与原数进行比较。
例如,对于三位数 153,百位数字是 1,十位数字是 5,个位数字是 3。计算 1³ + 5³ + 3³ = 1 + 125 + 27 = 153,所以 153 是水仙花数。
2.思路:小编认为既然要求各个数位上的3次方的和,那么就用整数除法取整和取模来表示出各个位数的值。
3.代码如下:
#include<stdio.h>
int main()
{
int a, b, c, d,sum;
for (int i = 100; i < 1000; i++)
{
a = i / 10;
b = i % 10;//个位数
c = a % 10;//十位数
d = i / 100;//百位数
sum = b * b * b + c * c * c + d * d * d;
if (sum == i) {
printf(" %d", i);
}
}
}
4.回文数
1.回文数原理:回文数是指正读和反读都相同的整数。
其原理在于数字的对称性。对于一个整数,通过将其各位数字进行反转,然后与原数字进行比较,如果相等,则为回文数。
例如,数字 121,将其反转得到 121,与原数字相同,所以 121 是回文数;而 123 反转后为 321,与原数字不同,所以 123 不是回文数。
2.思路:小编认为既然要求回文,那么就得抓住数字翻转后还是与原来的数字一样,那么个位变成百位即最高次位,以此类推咧如一个三位数123翻转后就是321,即3 到 3*10+2 到 32*10+1;在与原来的数相比较。且要在while循环中对应不同的位数。
3.代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int isPalindrome(int num) {
int originalNum = num;
int reversedNum = 0;
while (num > 0) {
reversedNum = reversedNum * 10 + num % 10;//实现数字的逆转
num /= 10; //实现跳出循环
}
if (originalNum == reversedNum) {
return 1;
}
else {
return 0;
}
}
int main() {
int num;
printf("请输入一个整数: ");
scanf("%d", &num);
if (isPalindrome(num)) {
printf("%d 是回文数\n", num);
}
else {
printf("%d 不是回文数\n", num);
}
return 0;
}
由于小编用的vs2022编程,所以scanf函数不安全得加#define _CRT_SECURE_NO_WARNINGS
5.阿姆斯特朗数
1.阿姆斯特朗数的原理(也称自恋数):阿姆斯特朗数(也称为自恋数)是指一个 n 位数,其各位数字的 n 次幂之和等于该数本身。
其原理在于对数字进行位的分解,获取每一位上的数字,然后按照位数进行相应的幂运算,并将这些幂运算的结果相加,最后与原数进行比较。
例如,三位数的阿姆斯特朗数 153,因为 1³ + 5³ + 3³ = 1 + 125 + 27 = 153。
再如,四位数的阿姆斯特朗数 1634,1⁴ + 6⁴ + 3⁴ + 4⁴ = 1 + 1296 + 81 + 256 = 1634
2.思路:小编认为在判断几次幂的时候就涉及到求输入数字的位数。
第二步就是求出各个位数上的值,并用循环求出对应位数的几次幂,最后相加就好了。
3.代码如下:
小编这里还是采用的是用while循环,在输入数字不断除以10的情况下小于0截止。
对于第一个for循环来表示各个位数进行幂运算后相加,第二个for循环来表示进行位数的幂运算。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int countNumber(int number)
{
int count = 0;
int a,sum=1,sumber=0;
int saveNumber = number;
while (number > 0)
{
number /= 10;
count++;
}
printf("%d位数\n", count);
for (int i = 0; i < count; i++)
{
a = saveNumber % 10;
saveNumber=saveNumber / 10;
for (int j = 0; j < count; j++)
{
sum = sum * a;
}
sumber = sumber + sum;
sum = 1;
}
return sumber;
}
int main()
{
int number;
scanf("%d", &number);
int count = countNumber(number);
if (count == number)
{
printf(" %d是阿姆斯特朗数", number);
}
else
{
printf("%d不是阿姆斯特朗数",number);
}
return 0;
}
记得每次进行完位数的幂运算后sum要归位1;
6.总结
对于每个特殊数字的求法来说,要抓住每个数字求法的原理,熟练运用for循环嵌套,想明白如何用代码实现原理,咧如我们要求各个位数上的几次幂,就要求各个数位上的值为多少,就要用模运算。
当然小编能力还不够,这些算法时间复杂度可能不小,或者代码调试不完整,希望个位uu提出宝贵意见。
看到这里了麻烦给小编一个小小的赞,鼓励一下吧。