目录
csp认证考试 202312-2 因子化简 c语言解答
题目:
解析:
本题考查了long long (int)长长整数类型。可能会有很多人都会在这里因为编译错误,然后爆0,那就可惜了。(比如我刚刚就一直编译错误)。本题,我是用数组加结构体进行解的,其实核心就是把一个数转换为他的简化值。
简化值的转换,我的思路:
第一步:求出数n的最小素数因子s;
第二步:然后计算n/s的最小素数因子,直达求得的最小素数因子是它本身时,则说明计算完成。
注意:每次计算得到最小素数因子后,都应该对对应的t值,即我代码中的mi(幂)进行加。
刚刚说到编译错误,在csp考试系统里面,是不会有任何警告提示的,我们一般都是首先用DevC++编写代码,所以我们可以将DevC++设置为显示更多警告,可以方便你检查代码的严谨性
如图:(大家也可以参考这篇文章:参考链接)我就是参考的这篇文章的。
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
long long s;
int mi;
struct node *next;
}node,*Node;
long long min (long long n); //给定一个数,返回最小素数因子。若没有,则返回
long long gets (long long n,int k); //给定一个数,以及对应的阈值。返回简化后的值。
Node creat(long long s,Node L); //创建节点
int main ()
{
int q;
scanf("%d",&q);
long long num[10]={0}; //需要查询的q个数,注意这里应该是long long型
int K[10]={0}; //对应的阈值
int i=0; //输入n和对应的k
for(i=0;i<q;i++)
{
scanf("%lld %d",&(num[i]),&(K[i]));
}
for(i=0;i<q;i++)
{
long long sum=gets(num[i],K[i]);
printf("%lld\n",sum);
}
return 0;
}
long long min (long long n)
{
for (long long i = 2; i * i <= n; i++) {
if (n % i == 0) {
return i;
}
}
return (n > 1) ? n : 0;
}
long long gets (long long n,int k)
{
Node L=(Node)malloc(sizeof(node));
if (!L)
{
perror("error");
exit(EXIT_FAILURE);
}
L->next=NULL;
Node p;
while(1)
{
long long s1=min(n);
if(s1!=0)
{
int f1=1;
p=L->next;
while(p)
{
if(p->s==s1)
{
(p->mi)++;
f1=0;
break;
}
p=p->next;
}
if(f1==1)
{
L=creat(s1,L);
}
n=n/s1;
}
if(s1==0)
{
break;
}
}
long long sum=1;
p=L->next;
while(p)
{
if(p->mi>=k)
{
for(int i=0;i<(p->mi);i++)
sum*=p->s;
}
p=p->next;
}
p = L->next;
while (p) {
Node temp = p;
p = p->next;
free(temp);
}
free(L);
return sum;
}
Node creat(long long si,Node L)
{
Node p=(Node)malloc(sizeof(node));
p->next=L->next;
L->next=p;
p->s=si;
p->mi=1;
return L;
}
注意:编译环境选择C++环境,就是第二个!!!
博主的题目都是自己写的,可能思路方法不是最好的,但是希望能给正在备战的你提供一条思路,若大佬有更好的思路。可以评论区或是Si我指点指点。
感谢各位友友支持,每天更新一题。收藏加关注,回头不迷路!!!