一道小小的ACM题,用C或者C++写,提交老是说超时,求高人指点迷津

源码:#include"stdio.h"intmain(){intn,i=0;scanf("%d",&n);while(n){intj,a=1;intt=n;for(j=... 源码:#include "stdio.h"

int main()
{
int n,i = 0;
scanf("%d",&n);
while(n)
{
int j,a = 1;
int t = n;
for(j = 2;j < n;j++)
if(t % j == 0)
{
t= t / j;
a= a * (j - 1);
}
if(a == 1)
a = t - 1;
else
a =a * t;
printf("%d\n",a);
scanf("%d",&n);
}
return 0;
}
原题:
LK的数学题
时间限制:1000 ms | 内存限制:65535 KB
难度:3

描述
LK最近遇到一个问题,需要你帮她一下。一个整数n,求[1,n)中,和n互素的数的个数。

输入
多组测试数据,每一行有一个整数n(n<1000000001),0表示输入结束。
输出
小于n同时和n互素的整数的个数
样例输入

7
12
0

样例输出

6
4
展开
 我来答
蓝色污点
2011-11-20
知道答主
回答量:37
采纳率:0%
帮助的人:24.4万
展开全部
这题是考欧拉函数的应用

参考代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
unsigned euler(unsigned x)
{
unsigned i, res=x;
int sum = (int)sqrt(x * 1.0) + 1;
for (i = 2; i < sum; i++)
if(x%i==0) {
res = res / i * (i - 1);
while (x % i == 0) x /= i; // 保证i一定是素数
}
if (x > 1) res = res / x * (x - 1);
return res;
}
int main()
{
int n;
while (scanf("%d",&n)&&n)
{
printf("%d\n",euler(n));
}
return 0;
}
落葉繁華盡
2011-11-20 · TA获得超过166个赞
知道答主
回答量:158
采纳率:100%
帮助的人:144万
展开全部
和7互素的就6个啊怎么会输出12自己算一下就知道我这里有一个c++编的你看一下把
#include<iostream>
using namespace std;
void main(){
long a;
int k=0,loop=1;
cin>>a;
while(loop){
for(long i=2;i<a;i++)
if(a%i==0)k++;
cout<<k<<endl;
k=0;
cin>>loop;

}
}
如果你要输出上面的东西你可以在输出结果的时候再乘以一个2
望及时采纳~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-11-20
展开全部
估计是算法不对
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式