枚举巩固1+2

本文通过分析青藤oj中的多个题目,包括约数总和、质因数分解及其升级版、求日龄、四位数ABCD的关系和完数问题,展示了枚举算法在解决这些问题上的应用。每个题目都包含了问题描述、输入输出格式、解题思路及代码实现,旨在巩固枚举算法的理解和使用。

枚举巩固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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值