UVA - 11752 The Super Powers 【超级幂+数论+暴力枚举】

本文介绍了一种算法,用于找出1至2^64-1之间所有可由至少两个不同正整数的幂形式表示的超级幂数。通过枚举底数和指数,利用set容器去重并排序,最终输出所有超级幂。文章提供了详细的解题思路及AC代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目传送门

题目描述:称一个可以由至少两个不同正整数的幂的形式表示的数为超级幂。输出1~2^64-1之间的所有超级幂。

解题思路:由数论基本定理可知,任何一个数都可以分解为素数的乘积。如果一个数可以表示为n^k且这个数为超级幂那么指数k必须为合数(自然数中除了能被1和本身整除外,还能被其他的数整除的数)。设一个数由两部分组成,底数和指数:

底数最小为2,那么指数最大为64;

指数最小为4;那么底数最大为2^16;

暴力枚举,利用容器set去重且从小到大自动排序

AC代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
using namespace std;
#define io ios::sync_with_stdio(0),cin.tie(0)
#define ms(arr) memset(arr,0,sizeof(arr))
#define inf 0x3f3f3f
typedef long long ll;
typedef unsigned long long ULL;
const int mod=1e9+7;
const ULL maxn=(1<<64)-1;
bool isprime[66];
void getprime()//找出将小于等于64的所有合数,并赋值为false
{
    memset(isprime,true,sizeof(isprime));
    for(int i=2;i<=64;i++)
        for(int j=2;j*j<=i;j++)
            if(i%j==0)
                isprime[i]=false;
}
set <ULL> s;
int main()
{
    getprime();
    s.insert(1);
    for(int i=2;i<=(1<<16);i++)//枚举底数
    {
        ULL ans=1;
        for(int j=1;j<=64;j++)//枚举指数
        {
            ans*=i;
            if(!isprime[j])
                s.insert(ans);
            if(ans>maxn/i)//防止ans大于边界
                break;
        }
    }
    set <ULL>::iterator a;
    for(a=s.begin();a!=s.end();a++)//输出所有超级幂
        cout<<*a<<endl;
    return 0;
}

 

### C语言实现材料热阻计算表格 以下是基于提供的Python代码逻辑,将其转换为C语言版本的代码实现。此代码实现了热阻计算的功能,并将结果以表格形式输出。 #### 功能说明 - 输入温度差 `delta_T` 和热功率 `power`。 - 使用公式 \( R_{\theta} = \frac{\Delta T}{P} \) 计算热阻。 - 输出结果并打印成表格形式。 ```c #include <stdio.h> // 定义函数用于计算热阻 double calculate_thermal_resistance(double delta_T, double power) { return delta_T / power; } int main() { // 示例输入数据 double temperatures[] = {10.0, 20.0, 30.0}; // 不同的温度差 (°C) double powers[] = {5.0, 10.0, 15.0}; // 对应的不同热功率 (W) int size = sizeof(temperatures) / sizeof(temperatures[0]); printf("-------------------------------------------------\n"); printf("| 温度差 (ΔT/°C) | 热功率 (P/W) | 热阻 (R&theta;/°C/W) |\n"); printf("-------------------------------------------------\n"); for (int i = 0; i < size; ++i) { double delta_T = temperatures[i]; double power = powers[i]; // 调用函数计算热阻 double thermal_resistance = calculate_thermal_resistance(delta_T, power); // 打印表格中的每一行 printf("| %-14f | %-12f | %-15f |\n", delta_T, power, thermal_resistance); } printf("-------------------------------------------------\n"); return 0; } ``` --- #### 运行结果示例 假设输入如下数组: - 温度差:\[10.0, 20.0, 30.0]\(单位:°C) - 热功率:\[5.0, 10.0, 15.0]\(单位:W) 运行程序后,输出的结果将是: ``` ------------------------------------------------- | 温度差 (ΔT/°C) | 热功率 (P/W) | 热阻 (R&theta;/°C/W) | ------------------------------------------------- | 10.000000 | 5.000000 | 2.000000 | | 20.000000 | 10.000000 | 2.000000 | | 30.000000 | 15.000000 | 2.000000 | ------------------------------------------------- ``` 以上结果显示了不同条件下的热阻值,便于对比分析[^1]。 --- #### 关键点解释 1. **函数封装** 将热阻计算逻辑封装到独立的函数中,提高代码可读性和复用性。 2. **动态输入支持** 用户可以通过修改 `temperatures` 和 `powers` 数组来自定义不同的测试场景。 3. **表格化输出** 利用格式化字符串 (`printf`) 实现清晰易懂的表格展示效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值