永发信息网

杭电上的题

答案:2  悬赏:60  手机版
解决时间 2021-02-27 20:09
  • 提问者网友:杀生予夺
  • 2021-02-27 09:54
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
我的代码
#include<stdio.h>
int gcd(int m,int n)
{
int r;
r=m%n;
while(r)
{
m=n;
n=r;
r=m%n;
}
return n;
}
int main ()
{
int m,n,i,j;
while(~scanf("%d",&m))
{
for(j=0;j<m;j++)
{
scanf("%d",&n);
int flag=0;
for(i=1;i<n;i++)
{
if(gcd(i,n)<1||gcd(i,n)==1)
{
flag++;
}
}
printf("%d\n",flag);
}
}
return 0;
}
超时了 怎么改啊
最佳答案
  • 五星知识达人网友:纵马山川剑自提
  • 2021-02-27 10:54
用筛选法,累死找素数的,不要用公约数暴力,这样肯定超时
#include <iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int *a=new int[n];
for(int i=1;i<n;i++)
a[i]=1;
for (int i=2;i<=n/2;i++)
{
if (n%i==0)
for (int j=1;i*j<n;j++)
a[i*j]=0;
}
int sum=0;
for (int i=1;i<n;i++)
sum+=a[i];
cout<<sum<<endl;
delete a;
}
}
全部回答
  • 1楼网友:鱼芗
  • 2021-02-27 11:36
百度搜索 猪头帮协会 找新朋友
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯