用c语言求素数,完全,水仙花,回文,阿姆斯特朗数

2024-09-24 13:15:37 浏览数 (3)

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.代码如下:

代码语言:javascript复制
#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(" %dn", i);
		}
	}
	return 0;

}

淡然小编还在if语句单独判断了1这个特殊数字,每次循环后别忘了重置a的值为0。

2.求完全数

1.完全数的原理:完全数是指所有真因子(即除了自身以外的约数)的和恰好等于它本身的数。

2.思路:小编认为完全数与素数的写法基本一致,在第二个循环中判断能否被除尽,即取模为0;如果为0,那么就相加,保存在一个变量里。

3.代码如下:

代码语言:javascript复制
#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.代码如下:

代码语言:javascript复制
#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.代码如下:

代码语言:javascript复制
#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循环来表示进行位数的幂运算。

代码语言:javascript复制
#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提出宝贵意见。

看到这里了麻烦给小编一个小小的赞,鼓励一下吧。

0 人点赞