csp 202312-2 因子化简 C/C++ 满分解答

目录

csp认证考试 202312-2 因子化简 c语言解答

题目

解析

代码


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我指点指点。

感谢各位友友支持,每天更新一题。收藏加关注,回头不迷路!!!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咔拉西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值