ACM整数性问题(nefu115和hdu2099)

来源:互联网 发布:gcr.io 阿里云 编辑:程序博客网 时间:2024/06/06 07:31

首先要了解整除的基本性质:

1.若a整除b且a整除c,则对任意的x,y有a整除xb+yc。

2.若a整除b且b不为0,则绝对值a小于等于绝对值b。

3.若a整除b,则ca整除cb(c不为0)。

4.若a整除b且b整除a,则a=±b。

5.若a整除b且b整除c,则a整除c。

下面来看一道简单题nefu115

题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=115

Description

已知斐波那契数列有如下递归定义,f(1)=1,f(2)=1, 且n>=3,f(n)=f(n-1)+f(n-2),它的前几项可以表示为1, 1,2 ,3 ,5 ,8,13,21,34…,现在的问题是想知道f(n)的值是否能被3和4整除,你知道吗?

Input2

输入数据有若干组,每组数据包含一个整数n(1<n<1000000000)。

Output

对应每组数据n,若 f(n)能被3整除,则输出“3”; 若f(n) 能被4整除,则输出“4”;如果能被12整除,输出“YES”;否则输出“NO”。

Sample Input

46712

Sample Output

34NOYES
分析:斐波那契数列的整除题,数据给的n数据范围较大,可能会溢出,由数论知识的规律可发现,当且仅当n可以整除4时,f(n)能整除3;当且仅当n可以整除6时,f(n)能整除4;

则推出能整除12时,f(n)能整除12;(4和6的最小公倍数是12)

浅显易懂的AC代码:

#include<cstdlib>#include<iostream>using namespace std;int main(int arge,char *argv[]){int n;while(cin>>n){if(n%12==0)cout<<"YES"<<endl;else{if(n%4==0)cout<<"3"<<endl;elseif(n%6==0)cout<<"4"<<endl;elsecout<<"NO"<<endl;}}return 0;}

再来看一道经典简单题hdu2099

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2099

Problem Description
一个整数,只知道前几位,不知道末二位,被另一个整数除尽了,那么该数的末二位该是什么呢?
Input
输入数据有若干组,每组数据包含二个整数a,b(0<a<10000, 10<b<100),若遇到0 0则处理结束。
Output
对应每组数据,将满足条件的所有尾数在一行内输出,格式见样本输出。同组数据的输出,其每个尾数之间空一格,行末没有空格。
Sample Input
200 401992 950 0
Sample Output
00 40 8015
上面那题数据量n太大,这题小枚举0-99然后再加上整数a后对b取余即可。

简单AC代码如下二种。这种简单题能AC就是好方法注意下输出格式的空格

一:

#include <stdio.h>int main(void){    int    i;    int    a, b;    int    c;    while (scanf("%d%d", &a, &b), a + b)    {        for (c = i = 0; i < 100; i++)        {            if ((a * 100 + i) % b == 0)                printf(c++ ? " %02d" : "%02d", i);        }        putchar('\n');    }}

二:

#include<cstdlib>#include<iostream>using namespace std;int main(int argc,char *argv[]){int a,b,sum;while(cin>>a>>b){if(a==0&&b==0)break;a=a*100;sum=0;for(int i=0;i<=99;i++)if((a+i)%b==0){sum++;if(sum>1)printf(" %02d",i);elseprintf("%02d",i);}putchar('\n');}}


原创粉丝点击