hdu1286 找新朋友

2024-02-29 04:08
文章标签 朋友 hdu1286

本文主要是介绍hdu1286 找新朋友,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



找新朋友

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6716    Accepted Submission(s): 3476


Problem Description
新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。

Input
第一行是测试数据的组数CN(Case number,1<CN<10000),接着有CN行正整数N(1<n<32768),表示会员人数。

Output
对于每一个N,输出一行新朋友的人数,这样共有CN行输出。

Sample Input
      
2 25608 24027

Sample Output
      
7680 16016

Author
SmallBeer(CML)

Source
杭电ACM集训队训练赛(VII)



问题如上

在这个题目上耗费了一下午加一晚上的时间。。= =真是略显水。

考虑了很多。。最终正确的代码如下:

#include <iostream>
#include <cstring>
#define max 32768
using namespace std;int p;
bool num[32768];
short cal[32768];
short prime[32768];
bool current[32768];int cm(int a, int b);//求公约数并返回最小公约数,b不是素数
void GetPrime();int main()
{int cn, i, no, cur, j;GetPrime();cin >> cn;while(cn --){memset(current,1, sizeof(current));cin >> cur;if(num[cur])cal[cur] = cur - 1;else{no = 1;for(i = 0; i < p && prime[i] < cur; i++){if(cur % prime[i] == 0)for(j = prime[i]; j <= cur; j += prime[i]){current[j] = false;}}for(i = 2; i <= cur; i++){if(current[i])no++;}cal[cur] = no;}cout << cal[cur] << endl;}return 0;
}
void GetPrime()
{int i, j, temp;memset(num, 1, sizeof(num));p = 2;prime[0] = 2;prime[1] = 3;for(i = 1; i <= 3; i++)num[i] = true;for(i = 4; i <= 32768; i++){if(num[i]){for(j = 0; j < p; j++){if(i % prime[j] == 0){num[i] = false;temp = i;while(temp <= 32768){num[temp] = false;temp += i;}break;}}if(num[i])prime[p++] = i;}}
}


一开始考虑到了各种问题。发现了如下问题:

1.数组下标不正确,与上方不相对应

2.对于sizeof理解不深刻,以及储存空间不够深刻,造成开始的memory溢出;

3.筛法原来就是开一个bool型的数组,然后从里面去除。计算素数的时候使用了筛法。(但是我一直不知道- -);

4.打表的方法可以用于数据量大并且可能有重复的情况。

5.建立全局变量以后里面的值如果并未初始化,存的全部是0.起码int,short,bool型是这个样子。


算法分析:

先求出在该范围的素数,然后求出输入数字的素数因子,使用筛法计算非素数数量。

本题设计到了最小公约数,素数。该题是一道水题,完全可以不计算所有的素数来求出。。但是我还是球了- -。


附加筛法代码,转载自:点击打开链接


//筛选法处理
#include <stdio.h>
#include <string.h>
char hash[32770];                   //使用字符型的减少了内存的开销int main()
{int i,j,t,n,count;while(scanf("%d",&t)!=EOF){while(t--){scanf("%d",&n);memset(hash,0,sizeof(hash));  //每次都要赋初始值count = 0;for(i=2;i<=n;i++){if(n%i==0)for(j=i;j<=n;j+=i)  // 这里是用了筛选法,注意的是j=i为初始条件 ,而不是j=i+i;hash[j] = 1;}for(i=1;i<=n;i++)                 if(hash[i]==0)count++;printf("%d\n",count);}}return 0;
}


另外还有欧拉函数,据说是最快的方法= =转载自 点击打开链接。。另外看打字哇啊什么的似乎是个蒙古汉子(指原作者)

#include <stdio.h>
int ans;
void Eu(int n){for(int i = 2; i * i <= n;++i){if(!(n%i)){ans *= i - 1;n /= i;while(!(n%i)){ans *= i;n/=i; } }}if(n > 1){ans *= n -1;}return ;
}
int main(){int n,test_case;scanf("%d",&test_case);while(test_case--){scanf("%d",&n);ans = 1;Eu(n);printf("%d\n",ans);}return 0;
}



这篇关于hdu1286 找新朋友的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/757531

相关文章

菲律宾诈骗,请各位华人朋友警惕各类诈骗。

骗子招聘类型:程序开发、客服、财务、销售总管、打字员等 如果有人用高薪、好的工作环境来你出国工作。要小心注意!因为这些骗子是成群结伴的! 只要你进入一个菲律宾的群,不管什么类型的群都有这些骗子团伙。基本上是他们控制的! 天天在群里有工作的信息,工作信息都是非常诱惑人的。例如招“打字员”、“客服”、“程序员”……各种信息都有。只要你提交简历了,他会根据你的简历判断你这个人如何。所谓的心理战嘛!

SDUT2779_找朋友(BFS裸二维)

找朋友 Time Limit: 1000MS Memory limit: 65536K 题目描述 X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。 为了简化问题,我们把地图抽象为n*m的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 m。矩阵中’X’表示X所在的初始坐标,’Y’表示Y的位置 ,

献给正在学习IT专业的朋友们

1.首先请你热爱这个专业。只有这样,你才会从抽象的理论中找到实实在在的快乐。如果 你不热爱她,或者只因为这是个热门专业,那么极力要求你放弃这个专业,因为计算机是 一把双刃剑,学好了你会飞黄腾达,学不好你毕业后会极其痛苦,高不成低不就,没有发 展潜力,如同学英语专业的人到了美国一样。 2.不要用功利眼光对待这个学科,这绝对不是点点鼠标就能挣钱的专业。不要去想做

mapreduce '找共同朋友',面试题

mapred找共同朋友,数据格式如下: [quote] A B C D E F B A C D E C A B E D A B E E A B C D F A [/quote] 第一字母表示本人,其他是他的朋友,找出有共同朋友的人,和共同朋友是谁 答案如下: import java.io.IOException;import java.util.S

DFS——找朋友

找朋友 Time Limit: 1000MS Memory limit: 65536K 题目描述 X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。 为了简化问题,我们把地图抽象为n*m的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 m。矩阵中’X’表示X所在的初始坐标,’Y’表示Y

请不要做浮躁的人——转给即将上路的程序员朋友

最近半年多来收到不少网上留言和邮件询问程序代码问题,我个人比较喜欢讲思路然后再指定一些参考网址或者文章,不过似乎太多初学者不太领情,丝毫不顾自己 薄弱的基础,只求代码,别的什么也不顾,说实在话本人工作比较忙,有时候确实帮每个问问题的人写代码实在是写不过来。曾有过写点学习方法或者学习心态的文 章,但也未实现,今天重温这篇文章之后转载下来,希望给大家带来帮助。 ===========

uniapp微信小程序分享给朋友或者分享朋友圈

methods:{// 分享到朋友圈onShareTimeline: function(res) {return {title: "彩云驿",imageUrl: "http://121.40.40.95:8183/static/img/logoF.4aa4b748.png"};},// 首页 分享 可以分享整个小程序onShareAppMessage() {return {t

【日记】又有朋友去了我想去的那座城市(1120 字)

正文   感觉到了史无前例的危机感,像是温水中的青蛙猛然察觉周围的环境在变热。但说实话,感觉还是没什么规划,有点迷茫。我只知道我必须跳出现在这个环境了。   昨天凌晨,有群友母亲病危,进了 ICU,问心肌炎加感冒预后怎么样。我都懵了,都心肌炎了,还不消炎吃药。她后来还说一度血压掉到 70/40,有其他群友问是不是该给血管扩张一下,我当时第一反应就是:这人疯了吗?想杀人吗?血压都 70 了还要扩

HDU1286:找新朋友

找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2748 Accepted Submission(s): 1282 Problem Description 新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人

我似乎与您成了无话不谈的好朋友

穿越太空的玩耍 今天的穿越太空的玩耍,老师,仔细地在羽毛上涂涂画画,造飞机,他也总爱和孩子们说,唱完后,我似乎与您成了无话不谈的好朋友,工程师,玩耍该车既能像普通汽车一样在路上行驶。 造轮船,鸟王又说,买了一盒36色的玩耍水彩笔,洒向艳羽鸟,说,一看到它,想到很多很多-吧嗒,时间过得真快,六年前。 百灵鸟抹上了亮晶晶的指甲油这时,哇,汽车上有很多按钮琳琅满目,让我们都能到太空旅游,刚刚我在