| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1771 人关注过本帖
标题:请大神看一下一道ACM的题,时间超限还错误50%,真是醉了。
取消只看楼主 加入收藏
赤云
Rank: 2
等 级:论坛游民
帖 子:82
专家分:35
注 册:2014-12-29
结帖率:64.71%
收藏
已结贴  问题点数:15 回复次数:1 
请大神看一下一道ACM的题,时间超限还错误50%,真是醉了。
题目:找新朋友
题目描述
    新年快到了,天勤准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。
输入
    第一行是测试数据的组数CN(Case number,1<CN<10000),接着有CN行正整数N(1<n<32768),表示会员人数。
输出
    对于每一个N,输出一行新朋友的人数,这样共有CN行输出。
样例输入
2
25608
24027
样例输出
7680
16016
程序代码:
#include <stdio.h>
#include <memory.h>
int yueshu[500],a[32770];
int zhaoyueshu(int n){//找n的约数,并返回约数的个数cnt
    int i,j=0,cnt=0;
    for(i=2;i<n;i++)
        if(n%i==0){
            yueshu[j++]=i;
            cnt++;
        }
    return cnt;
}
void Init(int n){//将数组a从第三个元素开始进行初始化
    int i;
    for(i=2;i<n;i++)
        a[i]=i;
}
void print(int n){//输出新朋友的个数
    int i,cnt=0;
    for(i=0;i<n;i++)
        if(a[i]!=0)
            cnt++;
    printf("%d\n",cnt+1);
}
int main(){
    int CN,n,cnt,i,j,t;
    scanf("%d",&CN);
    while(CN--){
        scanf("%d",&n);
        cnt=zhaoyueshu(n);
        Init(n);
        for(j=1,i=0;i<cnt;i++){
            t=yueshu[i]*j;
            while(t<n){
                a[t]=0;//将与n有共同约数的数设置为0(老朋友),方便输出新朋友的个数
                t=yueshu[i]*(++j);
            }
            j=1;
        }
        print(n);
        memset(a,0,sizeof(a));
        memset(yueshu,0,sizeof(yueshu));
    }
    return 0;
}
提交后反馈的结果是:
    时间超限且错误50%。
但是结果我测试的都正确,不知道什么四方错了。另外我也不知道怎么优化代码,望大神纸条明路。拜谢
搜索更多相关主题的帖子: 正整数 老朋友 number 朋友 会员 美国 number 会员 正整数 公约数 
2015-08-22 09:36
赤云
Rank: 2
等 级:论坛游民
帖 子:82
专家分:35
注 册:2014-12-29
收藏
得分:0 
回复 2楼 jklqwe111
也是超时,并且错误50%
2015-08-23 15:37
快速回复:请大神看一下一道ACM的题,时间超限还错误50%,真是醉了。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023618 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved