一个C语言的问题,是acm的题,我做了做,出了点小毛病。刚刚开始练acm,谢谢了
/*ProblemA:最喜欢的数字TimeLimit:1000ms题意zyf最喜欢的数字是1!所以他经常会使用一些手段,把一些非1的数字变成1,并为此得意不已。他会且仅会...
/*Problem A:最喜欢的数字
Time Limit : 1000ms
题意
zyf最喜欢的数字是1!所以他经常会使用一些手段,把一些非1的数字变成1,并为此得意不已。他会且仅会的两种手段是:
1.把某个数m除以某个质数p——当然p必须能整除这个数,即m=m/p
2.把某个数m减1,即m=m-1
有一天他突发奇想,想把[a,b]区间中所有的数一个一个地变成1,这是一个巨大的无聊的工程,所以他想知道他最少得花多少操作才能达到目的。
输入
输入包含多组数据(1000组数据),EOF结束。
每组数据为两个整数a和b(0<a<=b<=100000),意义如题意描述。
输出
对于每组数据,在一行上输出一个整数,表示最少操作数。
输入数据示例
2 3
3 5
11 12
对应于输入数据的输出结果示例
2
4
3
提示:C(C++)程序中以EOF结尾的数据输入方式:
while(scanf("%d%d",&a,&b)!=EOF) //输入整数
while(scanf("%s",str)!=EOF) //输入不含空格的串
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//判断是否为质数,以leap作为判断依据 ,质数为1,合数为0
int isprime(int m)
{
int k,i,leap=0;
k=(int)sqrt(m);
for(i=2;i<=k;i++)
{
if(m%i==0)
break;
}
if(i>=k+1)
{
leap=1;
}
return leap;
}
int method1(int m)//输入m值,使用步骤一减小m
{
int i,pmax=0,k;
int p;
for(p=2;p<=m;p++)
{
k=(int)sqrt(p);
for(i=2;i<=k;i++)
{
if(p%i==0)
break;
}
if(i>=k+1)
{
if((m%p==0)&&(p>=pmax))
{
pmax=p;
}
}
}
m=m/pmax;
return m;
}
int method2(int m) //输入m值,使用步骤二减小m
{
m=m-1;
return m;
}
int main()
{
int a,b,t;
int m;
int i=0; //i为计数器
printf("please input a:\n");
scanf("%d",&a);
printf("please input b:\n");
scanf("%d",&b);
if(a<b)
{t=a;a=b;b=t;}
for(m=a;m<=b;m++) //对m进行运算
{
while(m!=1)
{
if(isprime(m)==1)
{
m=method1(m);
i++;
// printf("%d",i) 这一步用来调试的,可是没有i的输出;
}
else if((isprime(m)==0)&&(isprime(m-1)==1))
{
m=method2(m);
i++;
m=method1(m);
i++;
}
else if(((isprime(m)==0)&&(isprime(m-1)==0))||(m==2))
{
m=method1(m);
i++;
}
}
}
printf("the min step is %d\n",i);
system("pause");
return 0;
}
问题是,主程序中为什么对于任何值输出都是0.主程序的判断算法我也不确定对不对,关键是输出总为0,不知道怎么改进了,谢谢了 展开
Time Limit : 1000ms
题意
zyf最喜欢的数字是1!所以他经常会使用一些手段,把一些非1的数字变成1,并为此得意不已。他会且仅会的两种手段是:
1.把某个数m除以某个质数p——当然p必须能整除这个数,即m=m/p
2.把某个数m减1,即m=m-1
有一天他突发奇想,想把[a,b]区间中所有的数一个一个地变成1,这是一个巨大的无聊的工程,所以他想知道他最少得花多少操作才能达到目的。
输入
输入包含多组数据(1000组数据),EOF结束。
每组数据为两个整数a和b(0<a<=b<=100000),意义如题意描述。
输出
对于每组数据,在一行上输出一个整数,表示最少操作数。
输入数据示例
2 3
3 5
11 12
对应于输入数据的输出结果示例
2
4
3
提示:C(C++)程序中以EOF结尾的数据输入方式:
while(scanf("%d%d",&a,&b)!=EOF) //输入整数
while(scanf("%s",str)!=EOF) //输入不含空格的串
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//判断是否为质数,以leap作为判断依据 ,质数为1,合数为0
int isprime(int m)
{
int k,i,leap=0;
k=(int)sqrt(m);
for(i=2;i<=k;i++)
{
if(m%i==0)
break;
}
if(i>=k+1)
{
leap=1;
}
return leap;
}
int method1(int m)//输入m值,使用步骤一减小m
{
int i,pmax=0,k;
int p;
for(p=2;p<=m;p++)
{
k=(int)sqrt(p);
for(i=2;i<=k;i++)
{
if(p%i==0)
break;
}
if(i>=k+1)
{
if((m%p==0)&&(p>=pmax))
{
pmax=p;
}
}
}
m=m/pmax;
return m;
}
int method2(int m) //输入m值,使用步骤二减小m
{
m=m-1;
return m;
}
int main()
{
int a,b,t;
int m;
int i=0; //i为计数器
printf("please input a:\n");
scanf("%d",&a);
printf("please input b:\n");
scanf("%d",&b);
if(a<b)
{t=a;a=b;b=t;}
for(m=a;m<=b;m++) //对m进行运算
{
while(m!=1)
{
if(isprime(m)==1)
{
m=method1(m);
i++;
// printf("%d",i) 这一步用来调试的,可是没有i的输出;
}
else if((isprime(m)==0)&&(isprime(m-1)==1))
{
m=method2(m);
i++;
m=method1(m);
i++;
}
else if(((isprime(m)==0)&&(isprime(m-1)==0))||(m==2))
{
m=method1(m);
i++;
}
}
}
printf("the min step is %d\n",i);
system("pause");
return 0;
}
问题是,主程序中为什么对于任何值输出都是0.主程序的判断算法我也不确定对不对,关键是输出总为0,不知道怎么改进了,谢谢了 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询