枚举巩固1+2
青藤oj #10198. 约数总和
题目描述
给出一个数n,计算n的所有的约数的总和
输入格式
一个整数n
输出格式
一个整数表述n的所有的约数的总和
思路
如果n=1,直接输出1;
如果n!=1,就先枚举到根号n,找出所有约数,然后判断约数是否重复,像是3*3=9;
然后累加输出;
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n,sum=0;
cin>>n;
if(n==1)
{
cout<<1;
return 0;
}
for(int i=1;i<=sqrt(n);i++)
{
if(n%i==0)
if(n/i!=i)
sum+=i+n/i;
else
sum+=i;
}
cout<<sum;
return 0;
}
青藤oj #10186. 质因数分解
题目描述
已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。
输入格式
输入只有一行,包含一个正整数 n。
输出格式
输出只有一行,包含一个正整数 p,即较大的那个质数。
思路
如果输入等于2,直接输出2;
如果不等于2,枚举找出所有质因数,输出最大的;
代码
#include<bits/stdc++.h>
using namespace std;
void h(int k)
{
int max=-1;
if(k==2)
cout<<"2"<<endl;
else
{
for(int i=2;i<=sqrt(k);i++)
{
while(k!=i)
{
if(k%i==0)
{
if(max<i) max=i;
k=k/i;
}
else
break;
}
}
if(k>max) max=k;
cout<<max<<endl;
}
}
int main()
{
int a;
cin>>a;
h(a);
}
青藤oj #10213. 质因数分解升级版
题目描述
求出区间[a,b]中所有整数的质因数分解。
输入格式
输入两个整数a,b。
输出格式
每行输出一个数的分解,形如k=a1a2a3…(a1< =a2< =a3…,k也是从小到大的)(具体可看样例)
思路
从a到b,每一个数都枚举输出质因数,和上一题一样;
代码
#include<bits/stdc++.h>
using namespace std;
void h(int k)
{
cout<<k<<"=";
if(k==2)
cout<<"2*1"<<endl;
else
{
for(int i=2;i<=sqrt(k);i++)
{
while(k!=i)
{
if(k%i==0)
{
cout<<i<<"*";
k=k/i;
}
else
break;
}
}
cout<<k<<endl;
}
}
int main()
{
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++)
h(i);
}
青藤oj #10215. 求日龄
题目描述
年龄是指一个人出生后以年为长度计算的时间整数值。
同理,日龄指一个人出生后以日为长度计算的时间整数值。
请求出给定日期出生的人,到2019年4月20日的日龄吧。
输入格式
一个日期,表示这个人的生日
输入日期一定在2019-4-20之前
输出格式
日龄
思路
建两个数组,分别表示平年和闰年每月的天数;
输入后先判断是否在2019-4-20之后,如果在之后就结束程序;
如果在之前,就判断是在2019年还是在之前;如果在2019年就用2019-4-20的天数(110)- 输入的天数;如果在之前,就先判断那一年完了有多少天,然后从2018年往回按年算看有几天,然后输出;
代码
#include<bits/stdc++.h>
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){
int y,m,d,sum,dd,ddd,num,i;
scanf("%d-%d-%d",&y,&m,&d);
sum=dd=ddd=0;
if(y>=2019&&m>=4&&d>=20||y>2019)
return 0;
else
{
num=0;
if(y==2019)
{
for(i=0;i<m;i++)
dd+=a[i];
dd+=d;
num=110-dd;
printf("%d\n",num);
}
else
{
num=0;
for(i=0;i<m;i++)
{
if(y%4==0&&y%100!=0||y%400==0)
{
sum+=b[i];
num=366-sum;
}
else
{
sum+=a[i];
num=365-sum;
}
}
num-=d;
for(i=2018;i>y;i--)
{
if(i%4==0&&i%100!=0||i%400==0)
ddd+=366;
else
ddd+=365;
}
num+=ddd+110;
printf("%d\n",num);
}
}
return 0;
}
青藤oj #10216. 四位数ABCD
题目描述
编程找出小于n的四位数ABCD中满足下述关系的数:
(AB+CD)∗(AB+CD)=ABCD
输入格式
输入一行,包含一个整数
输出格式
输出若干行。每行包含一个整数。
思路
从1000开始到n枚举,每次先取出每一位的数,然后判断是否符合条件,如果符合,输出;不符合,继续枚举。
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,a,b,c,d,ab,cd,abcd;
cin>>n;
for(int i=1000;i<=n;i++)
{
a=i/1000;
b=i/100%10;
c=i/10%100;
d=i%1000;
ab=a*10+b;
cd=c*10+d;
abcd=a*1000+b*100+c*10+d;
if(((ab+cd)*(ab+cd))==abcd)
printf("%d\n",abcd);
}
return 0;
}
青藤oj #10214. 完数
题目描述
一个数如果恰好等于它的因子之和,这个数就称 为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6就是“完数”。又如,28的因子为1、2、4、7、14,而 28=1+2+4+7+14,因此28也是“完数”。编写一个程序,判断用户输入的一个数是否为“完数”。
输入格式
输入只有一行,即一个整数
输出格式
输出只有一行,如果该数为完数,输出yes,否则输出no。
思路
从2开始枚举,累加所有约数,判断是否是完数;
代码
#include <bits/stdc++.h>
using namespace std;
int main ()
{
int n,b=1;
cin >> n;
for (int i=2; i<=sqrt(n); i++)
{
if (n%i==0)
{
b+=i;
b+=n/i;
}
}
if (b==n&&b!=1)
{
cout<<"yes";
}
else
cout<<"no";
return 0;
}
本文通过分析青藤oj中的多个题目,包括约数总和、质因数分解及其升级版、求日龄、四位数ABCD的关系和完数问题,展示了枚举算法在解决这些问题上的应用。每个题目都包含了问题描述、输入输出格式、解题思路及代码实现,旨在巩固枚举算法的理解和使用。

1188

被折叠的 条评论
为什么被折叠?



