C++(枚举法一练习题)

求方程的正整数解

【描述】编写程序,求X^2 + Y^2 = n 的正整数解,n为从键盘上输入的一个正整数。

【输入】输入数据占一行,为一个正整数n,10<=n<=10000

【输出】对输入的正整数,输出所有的解,格式如样例输出为例,如果没有解,则输出no answer。

【样例输入1】2000

【样例输出1】

2000=88+44 44

2000=2020+40 40

2000=4040+20 20

2000=4444+8 8

【样例输入2】1999

【样例输出2】no answer

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() 
{
    int n,x,y;
    cin>>n;
    int m = sqrt(n); //循环变量x和y的终值
    bool flag = false;//取值为true表示有解,取值为false表示无解
    for(x=1;x<=m;x++)//x从1枚举到m
    {
        for(y=1;y<m;y++)//y从1枚举到m
        {
            if(x*x + y*y == n)
            {
                flag = true;
                cout<<n<<"="<<x<<"*"<<x<<"+"<<y<<"*"<<y<<endl;
            }
        }
    }
    if(!flag) cout<<"no answer"<<endl;//无解
	return 0;
}

/*
【输入用例3】
2025
【输出用例3】
2025=27*27+36*36
2025=36*36+27*27
【输入用例4】
6666
【输出用例4】
no answer
【输入用例5】
7696
【输出用例5】
7696=36*36+80*80
7696=60*60+64*64
7696=64*64+60*60
7696=80*80+36*36
【输入用例6】
9999
【输出用例6】
no answer
*/

即是平方数也是立方数

【描述】64这个数即使平方数(82)也是立方数(43),现在想知道,对于给定的正整数n,

1~n范围内有多少个这种数。

【输入】输入占一行,为一个整数n

【输出】输出占一行,为求得的答案

【样例输入】100

【样例输出】

1

64

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() 
{
    long long n, k;
    cin >>n;
    int cnt =0;
    for(k=1; k*k*k*k*k*k<=n;k++)
    {
        cnt++;
        if(k*k*k*k*k*k<=n)
        {
            cout<<k*k*k*k*k*k<<endl;
        }
    }
    //cout<<cnt<<endl;
	return 0;
}

/*
【输入用例2】
10
【输出用例2】
1
64
【输入用例3】
50
【输出用例3】
1
【输入用例4】
150
【输出用例4】
1
64
【输入用例5】
1000
【输出用例5】
1
64
729
*/

分解质数

【描述】1742年,德国数学家哥德巴赫提出了著名的哥德巴赫猜想,任何一个不小于4的偶数都可以表示为两个质数之和。编写程序,将一个不小于4的偶数分解成两个质数之和,并输出所有的分解形式。

【输入】输入数据占一行,为一个偶数n,4<=n<=2^10。

【输出】对输入的偶数,输出所有的分解形式,样式输出如下所示

【样例输入】

34

【样例输出】

34=3+31

34=5+29

34=11+23

34=17+17

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int prime(int m)          //判断m是否为质数,如果是质数,返回1否则返回0
{
    int i, k=sqrt(m);
    for(i=2;i<=k;i++)
        if(m%i==0) break;//如果i能整除m,提前退出循环
    if(i>k) return 1;    //m为质数
    else return 0;       //m为合数
}
int main() {
    int n,a,b;
    cin>>n;//输入一个偶数
    if(n==4)
    {
      cout<<"4 = 2 + 2"<<endl; return 0;  
    }
    for(a=3;a<=n/2;a=a+2)//从a=3开始,每次递增2,跳过偶数
    {
        if(prime(a))
        {
          b=n-a;
            if(prime(b))
                cout<<n<<"="<<a<<"+"<<b<<endl;//找到一个分解
        }
    }
	return 0;
}

/*
【输入用例2】
20
【输出用例2】
20=3+17
20=7+13
【输入用例3】
60
【输出用例3】
60=7+53
60=13+47
60=17+43
60=19+41
60=23+37
60=29+31
【输入用例4】
76
【输出用例4】
76=3+73
76=5+71
76=17+59
76=23+53
76=29+47
【输入用例5】
88
【输出用例5】
88=5+83
88=17+71
88=29+59
88=41+47
【输入用例6】
100
【输出用例6】
100=3+97
100=11+89
100=17+83
100=29+71
100=41+59
100=47+53
*/

特殊的数

【描述】给出若干个整数,询问其中是否有一对数的和等于给定的数

【输入】共三行:第一行是整数n,表示有n个整数;第二个是n个整数;第三个是一个整数m,表示需要得到的和。

【输出】若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数满足条件,选择数对中较小的数最小组合。若找不到符合要求的数对,输出no。

【样例输入】

4

2 5 1 4

6

【样例输出】

1 5

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
    int i,j,n,a[100010],m;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    cin>>m;
    sort(a,a+n);//把a中的数按从小到大排序
    for(i=0;i<n;i++)
    {
        for(j=j+1;j<n;j++)
        {
            if(a[i]+a[j]==m){
                cout<<a[i]<< " "<<a[j]<<endl; return 0;
            }
        }
    }
    cout<<"NO"<<endl;
	return 0;
}

/*
【输入用例2】
4
2 5 3 4
7
【输出用例2】
2 5
【输入用例3】
5
2 5 3 4 6
8
【输出用例3】
2 6
【输入用例4】
6
2 5 3 4 6 1
8
【输出用例4】
NO 
【输入用例5】
7
2 5 3 4 6 1 8
9
【输出用例5】
1 8
*/
相关推荐
Klong.k1 小时前
如何避免Bean的线程安全问题
java·开发语言
basketball6161 小时前
C++ 单例模式完全指南:从饿汉式到现代 C++ 的最佳实践
java·c++·单例模式
黎阳之光1 小时前
视听融合新范式!黎阳之光打破视觉边界,声影协同赋能全域智慧管控
大数据·人工智能·物联网·算法·数字孪生
接着奏乐接着舞1 小时前
【无标题】
开发语言·前端·javascript
iiiiyu1 小时前
集合进阶(Map集合)
java·大数据·开发语言·数据结构·编程语言
玖釉-2 小时前
栈——栈的定义及基本操作
c++·windows·算法·图形渲染
月落归舟2 小时前
并发编程之volatile深度解析(二)
java·开发语言·volatile
不想写代码的星星2 小时前
C++ 内存序六件套:从完全同步到爱咋咋地
c++