c语言自幂数
时间: 2023-07-02 20:12:42 浏览: 255
自幂数是指一个数的各个位上的数字的幂次之和等于它本身。比如说153就是一个自幂数,因为1的三次方加上5的三次方加上3的三次方等于153。以下是一个简单的C语言程序,用于检测一个三位数是否为自幂数:
```c
#include <stdio.h>
#include <math.h>
int main() {
int num, originalNum, remainder, result = 0;
printf("请输入一个三位数: ");
scanf("%d", &num);
originalNum = num;
while (originalNum != 0) {
remainder = originalNum % 10;
result += pow(remainder, 3);
originalNum /= 10;
}
if (result == num)
printf("%d 是一个自幂数\n", num);
else
printf("%d 不是一个自幂数\n", num);
return 0;
}
```
在这个程序中,我们首先要求用户输入一个三位数,并且保存它。然后,我们使用一个while循环,将这个三位数的每一位数字的三次方相加,最后将结果和原始数字进行比较,以确定这个数字是否是一个自幂数。
相关问题
C语言整数幂1090
在C语言中,计算一个大整数的幂通常涉及到长整型数据类型和循环,因为直接使用乘法运算符`*`对于非常大的数值可能会超出系统预定义的最大整数范围。例如,如果你想计算10^90这样的大幂,可以手动实现快速幂算法(也称为“分治”策略),这是一种将大幂分解为小幂相乘的方法。
以下是手动实现的一个简单版本的快速幂算法示例:
```c
#include <stdio.h>
// 递归函数用于计算 a^(n/m)
long long power(long long base, int exponent, int m) {
if (exponent == 0)
return 1;
else if (exponent % 2 == 0) { // 如果指数偶数,简化操作
long long half = power(base, exponent / 2, m);
return (half * half) % m;
} else { // 如果指数奇数
long long half = power(base, exponent / 2, m);
return ((half * half) % m) * base % m;
}
}
// 计算给定基数的幂
long long integerPower(int base, int n) {
return power(base, n, 1e9 + 7); // 取模1e9+7避免溢出
}
int main() {
int base = 10;
int exponent = 90;
long long result = integerPower(base, exponent);
printf("10^90 的结果 mod 1e9 + 7 是: %lld\n", result);
return 0;
}
```
在这个代码中,我们首先检查指数是否为偶数,如果是,则对半数进行计算,然后平方。如果指数为奇数,我们会先计算一半的平方再乘以基数。通过取模操作(这里假设是1e9+7),我们可以防止整数溢出。
C语言快速幂和快速幂求逆元
快速幂是一种用于快速计算一个数的整数次幂的算法,其时间复杂度为O(logn)。而快速幂求逆元是在模意义下,求一个数的乘法逆元的算法,其时间复杂度也为O(logn)。
以下是C语言实现快速幂和快速幂求逆元的代码:
1. 快速幂
```c
#include <stdio.h>
typedef long long LL;
// a^k % p
int qmi(int a, int k, int p) {
int res = 1;
while (k) {
if (k & 1) res = (LL)res * a % p;
k >>= 1;
a = (LL)a * a % p;
}
return res;
}
int main() {
int n;
scanf("%d", &n);
while (n--) {
int a, k, p;
scanf("%d%d%d", &a, &k, &p);
printf("%d\n", qmi(a, k, p));
}
return 0;
}
```
2. 快速幂求逆元
```c
#include <stdio.h>
typedef long long LL;
// a^k % p
int qmi(int a, int k, int p) {
int res = 1;
while (k) {
if (k & 1) res = (LL)res * a % p;
k >>= 1;
a = (LL)a * a % p;
}
return res;
}
int main() {
int n;
scanf("%d", &n);
while (n--) {
int a, p;
scanf("%d%d", &a, &p);
int res = qmi(a, p - 2, p); // a^(p-2)
if (a % p) printf("%d\n", res); // 不是倍数,输出结果
else puts("impossible"); // 是倍数,不存在逆元
}
return 0;
}
```
阅读全文